An Easy Problem(贪心)

描述

给定一个正整数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;
}


发布了89 篇原创文章 · 获赞 77 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/wodemaoheise/article/details/104697756
今日推荐