【题目描述】
给定一个正整数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
思路分析:题目要求找到给出数字相同的二进制1的个数,首先我们需要计算出给出数字的二进制对应的1的个数cnt,之后通过循环暴力寻找到第一个大于n的数并且转化成二进制1出现的次数和n转化成二进制1出现的个数的相同输出并跳出循环。
#include<bits/stdc++.h>
using namespace std;
//计算二进制中出现的1的次数并返回
int calc(int x){
int sum=0;
while(x){
if(x%2==1){
sum++;
}
x/=2;
}
return sum;
}
int main(){
int n;
cin>>n;
while(n){
//首先计算n中含有多少个1
int cnt=calc(n);
//暴力枚举所有的情况找到第一个比n大且二进制的1的个数相等的数字
int temp=n+1;
while(1){
if(calc(temp)==cnt){
//找到了第一个
cout<<temp<<endl;
break;
}
temp++;
}
cin>>n;
}
}