【信奥赛一本通】给定一个正整数N,求最小的、比N大的正整数M,使得M与N的二进制表示中有相同数目的1。 举个例子,假如给定的N为78,其二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83,其二进制是1010011,因此83就是答案。
举个例子,假如给定的N为78,其二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83,其二进制是1010011,因此83就是答案。)
1.【题目描述】
【题目描述】
给定一个正整数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
2.【代码】
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[10000001],i; //i记录数组长度
for( i=0; ;i++)
{
cin>>a[i]; //输入所有测试数据
if(a[i]==0) //输入0结束
{
break;
}
}
int k=0; //数组下标0开始
while(i--)
{
int sum=0,sum1=0,d,b;
d=a[k]; //依次取出数组长度
while(d)
{
if(d%2==1)
{
sum++; //计算测试数据二进制中包含1的个数
}
d=d/2;
}
for(int z=a[k]+1; ;z++)
{
sum1=0;
int z1=z;
while(z1)
{
if(z1%2==1)
{
sum1++; //寻找和测试数据1个数相同的最小数
}
z1=z1/2;
}
if(sum==sum1) //找到就输出
{
cout<<z<<endl;
k++;
break;
}
}
}
return 0;
}
仅供参考!