Same binary weight

Same binary weight

时间限制: 300 ms  |  内存限制: 65535 KB
难度: 3
描述

The binary weight of a positive  integer is the number of 1's in its binary representation.for example,the decmial number 1 has a binary weight of 1,and the decimal number 1717 (which is 11010110101 in binary) has a binary weight of 7.Give a positive integer N,return the smallest integer greater than N that has the same binary weight as N.N will be between 1 and 1000000000,inclusive,the result is guaranteed to fit in a signed 32-bit interget.

输入
The input has multicases and each case contains a integer N.
输出
For each case,output the smallest integer greater than N that has the same binary weight as N.
样例输入
1717
4
7
12
555555
样例输出
1718
8
11
17
555557
 
    
暴力超时了:
 
#include<iostream>
#include<algorithm>
using namespace std;
int fun(int p)
{
	int sum=0;
	while (p)
	{
		if (p&1)
		{
			sum++;
		}
		p>>=1;
	}
	return sum;
}
int main()
{
	int n,j,k;
	while (cin >> n)
	{
		k=fun(n);
		j=0;
	   while (j!=k)
	   {
		   n++;
		   j=fun(n);
	   }
	   cout << n << endl;
	}
	return 0;
}                


我的代码:
 
    

  太坑了,c语言的while输入原来还要加上一个!=-1的东西,怪不得会超时。

#include<iostream>
#include<bitset>
using namespace std;
int main()
{
	int n,j,i,sum;
	bitset<32> k;
	while (cin >> n)
	{
		k=n;
		for (i=0,sum=0;i<32;++i)
		{
			if (k[i])
			{
				sum++;
			}
			if (k[i]&&!k[i+1])
			{
				k[i+1]=1;
				k[i]=0;
				j=i;
				break;
			}
		}
		sum--;
		for (i=0;i<j;++i)
		{
			if (i<sum)
			{
				k[i]=1;
			}
			else
			{
				k[i]=0;
			}
		}
		cout << k.to_ulong() << endl;
	}
	return 0;
}        

标程:
 
    
 
#include <cstdio>
//#include <iostream>
//using namespace std;
//void show(unsigned n){
//	for(int i=31;i>=0;i--)
//		if(n&(1<<i))
//			cout<<1;
//		else
//			cout<<0;
//	cout<<endl;
//}
int main(){
	int i,j;
	unsigned n;
	while(scanf("%u",&n)!=-1){
		for(i=0;i<32;i++)
			if(n&(1<<i)) break;
		for(j=i+1;j<32;j++)
			if((n&(1<<j))==0) break;
		//show(n);
		n|=(1<<j);	//first 0 to 1
		//show(n);
		n&=~((1<<j)-1);	//1 to 0(clear)
		//show(n);
		n|=((1<<(j-i-1))-1);	//0 to 1
		//show(n);
		printf("%u\n",n);
	}
}        


你可能感兴趣的:(C++,STL)