2243: Endless Carry

 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<stdio.h>
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;
}

你可能感兴趣的:(input,output)