2243: Endless Carry
Status | In/Out | TIME Limit | MEMORY Limit | Submit Times | Solved Users | JUDGE TYPE |
---|---|---|---|---|---|---|
stdin/stdout | 3s | 8192K | 732 | 256 | Standard |
作为2进制的加法,从k加1变成k+1可能会出现若干进位。如1011加1就会有2个进位。给定n,从0开始不停地加1直到n,计算在此过程中总共会有多少次进位。
Input
输入的每一行有单独的一个值n。n=0标志输入结束Output
对于输入的每一行,使用单独一行输出对应结果。Sample Input
2 5 10 0
Sample Output
1 3 8
/*可以看出,1位每2次发生一次进位,2位每4次发生一次进位,4位每8次发生一次进位。
也就是说 n/2+n/4+n/8+…就是结果。
由于如果n太大,i到最后有可能溢出,所以只计算到i<=n/2,剩下的加1就可以了。
*/
//这是二进制的进位 十进制的进位就要多一步了 for(i=10;i<=n;i*=10;) sum+=n/i;
#include
int main()
{
int n,i,sum;
while(scanf("%d",&n)&&n)
{
sum=0;
for(i=2;i<=n/2;i*=2)
{
sum+=n/i;
}
printf("%d/n",sum+1);
}
return 0;
}
{
int n,i,sum;
while(scanf("%d",&n)&&n)
{
sum=0;
for(i=2;i<=n/2;i*=2)
{
sum+=n/i;
}
printf("%d/n",sum+1);
}
return 0;
}