描述
给定一个正整数N,求最小的、比N大的正整数M,使得M与N的二进制表示中有相同数目的1。
举个例子,假如给定的N为78,其二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83,其二进制是1010011,因此83就是答案。
格式
输入格式
输入若干行,每行一个数n(1≤n≤1000000),输入"0"结束。
输出格式
输出若干行对应的值。
样例
输入样例
1
2
3
4
78
0
输出样例
2
4
5
8
83
限制
时间限制: 1000 ms
内存限制: 65536 KB
int two(int x) //统计1出现的次数
{
int tot=0;
while(x>0) //模拟短除法
{
if(x%2==1) //统计1出现的次数
tot++;
x/=2;
}
return tot; //返回1出现的次数
}
int main(){
int m;
while(scanf("%d",&m),m){ //无限输入
int a=m+1;
while(a>m){ //枚举所有大于m的数
if(two(a)==two(m)){ //如果出现1的次数相同
printf("%d\n",a); //直接输出并结束
break;
}
else{ //否则就继续找
a++;
}
}
}
return 0;
}