描述
As we known, data stored in the computers is in binary form. The problem we discuss now is about the positive integers and its binary form.
Given a positive integer I, you task is to find out an integer J, which is the minimum integer greater than I, and the number of '1’s in whose binary form is the same as that in the binary form of I.
For example, if “78” is given, we can write out its binary form, “1001110”. This binary form has 4 '1’s. The minimum integer, which is greater than “1001110” and also contains 4 '1’s, is “1010011”, i.e. “83”, so you should output “83”.
输入
One integer per line, which is I (1 <= I <= 1000000).
A line containing a number “0” terminates input, and this line need not be processed.
输出
One integer per line, which is J.
解题思路:
我想到了两个解题方法
第一种是我第一次看到这道题想到的方法,比较麻烦,首先直接算出 i 的二进制,并且表示出含有1的数量,然后以1的数量为条件,将二进制进行排序,但要考虑到 i 的特殊情况,比如类似1000时,就要进行加0然后得出答案,或者类似1111这种全为1时,也要加0,最后再把排序得到的倒数第二个最小的出提出然后将其再转化为十进制。当然因为这是贪心算法的题目,有简单的方法为什么要用麻烦的呢= =
第二种就是直接算出 i 中1的数量,然后利用循环输入>=i+1的数,找到与 i 有相同1的数量的数即可得到结果。
所以有了第二种思路之后我们便可以利用1的数量来做题
int num(int a)
{
int n=0; //统计1的数量
while(a!=0)
{
if(a%2==1) //如果出现1
n++; //进行累加
a/=2;
}
return n;
}
剩下的就是进行循环了
利用for(int a=i+1;;a++)
说的已经够多了,直接上代码
#include <iostream>
using namespace std;
int num(int a)
{
int n=0;
while(a!=0)
{
if(a%2==1)
n++;
a/=2;
}
return n;
}
int main()
{
int i;
while(cin >>i)
{
if(i==0) //根据题目所说,当i为0时,直接结束
break;
for (int a=i+1;;a++)
{
if(num(a)==num(i)) //当两个数1的数量相等时
{
cout <<a<<endl; //直接输出答案并且停止循环
break;
}
}
}
return 0;
}