http://www.lightoj.com/volume_showproblem.php?problem=1042
这个模板是计算一个数比该数大,并且转换成二进制后1的个数都一样
很久以前写的,风格和现在大不一样了= =
int calc(int n) { memset(a, 0, sizeof(a)); int z=0; //int nn=n; while(n)//把这个数放到一个数组中,其中最后一位放a[0]里 { a[z++]=n%2; n/=2; } int i; int count=0; for(i=0;i<=z+1;i++) { if(a[i]==1)count++;//统计1的个数 if(a[i]==1&&a[i+1]==0)//如果数到这个1,并且比它高一位的是0 { a[i+1]=1;//这个高位变成1 a[i]=0;//本身变成0 int j; n=i-1;//n就是刚刚i的低一位 for(j=1;j<=count-1;j++)//把i位置低count-1位1全都变为0 { a[n--]=0; } for(j=0;j<count-1;j++)//从a[0]开始,循环count-1次,变成1,这样就有了相同的1的个数了 a[j]=1; break; } } int sum=0; for(i=0;i<=z+1;i++)//计算sum的值,转换成10进制 sum+=a[i]*(1<<i); return sum; }