题目描述
给定正整数n,你的任务是用最少的操作数把序列1,2,3,...,n-1,n都变成0.每次操作可从序列中选择一个或多个整数,同时减去一个相同的正整数.比如1,2,3可以把2,3同时减去2,变成1,0,1.
输入
多组测试数据,每组仅一行,为正整数n.(1<=n<=10^9)
输出
对于每组数据输出最少的操作次数
样例输入
1
2
3
样例输出
1
2
2
提示
来源
【想法】
主要是如何实现每次都是最少次数,
1 ->1次
1 2 ->2次
1 2 3 ->1 0 1 ->0 0 0 ->2次
1 2 3 4 ->1 2 12 (可以有规律了) ->1 0 10 ->0 0 0 0 ->3次
1 2 3 4 5 ->1 2 0 1 2 (第二个)->
1 2 3 4 5 6 ->1 2 3 1 2 3(第三个)->
最终规律就是如图
个数 n的次数 最少次数
1 1-1 ==========1
2 2-3 ==========2
4 4-7 ==========3
8 8-15 ==========4
16 16-31 ==========5
32 32-63 ==========6
代码就可以是:
#include<stdio.h>
#include<math.h>
int main()
{
double n,m;
while( ~scanf("%lf",&n) ){
m=(int)log2(n);//比如 log2(8)<log2(9)<log2(16)进行int(取整后符合规律的一部分)
printf("%.f\n",m+1);
}
return 0;
}