问题描述
给定一个正整数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
#include<stdio.h>
void search(int x,int y)
{
int num=0,i,j,t;
int res[32];
x+=1;
t=x;
for(i=0;i<32;i++)
{
res[i]=t%2;
t/=2;
if(res[i]==1)
num++;
}
if(num==y)
printf("%d\n",x);
else
search(x,y);
}
int main()
{
int count=0,eazy[10000],i,j,a[10000];
for(i=0;i<10000;i++)
{
scanf("%d",&eazy[i]);
if(eazy[i]==0)
break;
a[i]=eazy[i];
count++;
}
int pro[32];
int num[count];
for(i=0;i<count;i++)
{
num[i]=0;
for(j=0;j<32;j++)
{
pro[j]=a[i]%2;
a[i]/=2;
if(pro[j]==1)
num[i]++;
}
}
for(i=0;i<count;i++)
{
search(eazy[i],num[i]);
}
return 0;
}