信息学奥赛一本通 1223:An Easy Problem(evd)

  • 时间:
  • 浏览:
  • 来源:互联网

【题目描述】
给定一个正整数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
【心得】全在代码里面!
【AC代码】

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int a[25];
int main()
{
	int t;
	while(scanf("%d",&t)==1)
	{
		if(t==0) break;
		int k=0;
		memset(a,0,sizeof(a));
		while(t)//将原数转为2进制 
		{
			a[k++]=t%2;
			t=t/2; 
		}
		int i=0,j=0;
		while(a[i]==0) i++;
		while(a[i]) i++,j++;//从低位到高位找到一段连续的1的区间,并计算1的个数 j 
		a[i]=1;//在连续1区间高位边界的高一位赋1,剩余位从低到高赋j-1个1 
		t=0;
		for(int l=0;l<i;l++) a[l]=0;//低位先全赋0 
		for(int l=0;l<j-1;l++) a[l]=1;//从低位到高位赋1 
		for(int l=0;l<=k;l++) t=t+a[l]*pow(2,l);//计算新数 
		cout<<t<<endl;
	}
	return 0;
}

本文链接http://element-ui.cn/article/show-220235.aspx