/*思路:先找出第一个1,统计从第一个1开始连续1的个数,并把1变成0,
如果1的下一位是0,把0变成1,然后从最低位开始找不是1的位赋值为1,
直到1的个数符合原数字1的个数*/
#include<stdio.h>
int main()
{
int n,k,s;
int i,j,sum;
int flag1,flag2;
int a[100],b[100];
while(scanf("%d",&n),n)//输入n,如果是0就结束
{
flag1=sum=s=i=j=0,flag2=1;//初始化
while(n)
{
a[i++]=n%2;//输入数据存入一位一位数组
n=n/2;
}
k=(i--);//k为数字的长度
while(i>=0)
{
b[j++]=a[i--] ; //把数组中的数字前后颠倒
}
for(j=k-1;j>=0;j--)
{
if(b[j]==0&&flag1==0)//如果当前位置是0并且没有遇到第一个1
continue; //继续检查下一位置
if(b[j]==1)//如果当前位置是1
{
flag1=1;//遇到了1标志位置1
b[j]=0;//把当前位置赋值为0
s++; //计数器加1
}
else//如果当前位置是0
{
b[j]=1;
flag2=0;
break;
}
}
for(j=k-1;;j--)
{
if(b[j]!=1)
{
if(!(--s))break;
b[j]=1;
}
}
for(j=0;j<k;j++)
{
if(b[j]==1)
sum+=1<<k-j-1;
}
printf("%d\n",sum+flag2*(1<<k));
}
}
北大ACM poj2453
最新推荐文章于 2021-02-25 09:49:00 发布