An Easy Problem(c++ 贪心算法)

描述

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;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值