描述
给定一个正整数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
思路:10进制转为2进制,统计2进制的n有多少个1,然后贪心思想,将10进制的n向上递增,判断递增后的数的二进制表达有多少个1
#include <iostream>
#include <string.h>
using namespace std;
int judge(int n){
int tmp, sum=0;
for (int i=0; n!=0; i++) { //除2取余转为2进制,然后统计有多少个1
tmp = n % 2;
n = n / 2;
if (tmp == 1) {
sum++;
}
}
return sum;
}
int main()
{
int n, count=0, ans=0;
scanf ("%d", &n);
while (n != 0) {
count = judge(n);
for (int i=n+1; ; i++) {
if (judge(i) == count){
ans = i;
break;
}
}
printf ("%d\n", ans);
scanf ("%d", &n);
}
return 0;
}