题目描述
给定一个正整数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>
#include<string.h>
#include<math.h>
int main(){
int n,i,s,a[1000],index,b,sum;//2 010
while(~scanf("%d",&n)){
memset(a,0,sizeof(a));
i=1;
sum=0;
s=0;
if(n==0) break;
while(n!=0){
a[i]=n%2;
n/=2;
i++;
}
index=i;
for(i=1;i<=index;i++){
if(a[i]==1&&a[i+1]==0){
b=i;
break;
}
if(a[i]==1){
sum++;
}
}
for(i=1;i<=index;i++){
if(i<=sum) a[i]=1;
else if(i<=b) a[i]=0;
else if(i==b+1) a[i]=1;
}
for(i=1;i<=index;i++){
s+=a[i]*(int)pow(2,i-1);
}
printf("%d",s);
printf("\n");
}
return 0;
}
更好的方法 链接:http://www.bubuko.com/infodetail-2400095.html
被自己蠢哭…………