loj_1042

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;
}
原文地址:https://www.cnblogs.com/louzhang/p/2563982.html