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.
/*分析:把n转换成二进制,找到第一个为 1 的位置p1(x&-x),
从该位置开始再找第一个为 0 的位置p2,统计从p1位置到p2位置
1 的个数 c,然后把位置p2的0转换为1,最后把c-1个 1 加到最低位。
*/
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int t,t1,t2;
t=n;
int tt=n&-n;
if(t==tt) //为1的时候
{
n=n<<1;
cout<<n<<endl;
continue;
}
int c=0,s=0;
while(t)
{
t1=t&-t;//找到并截取第一个1及其后面0构成的十进制数赋给t1
t=t-t1;
t2=t&-t;
c++;s+=t1;
if(t2>2*t1)//找0的位置,或者说找不在一起的1(即11(2进制)), 应该找101,1001,100001.。。。。而非1111类型的
{
t1=t1<<1;
n = n-s+t1+pow(2,c-1)-1;
break;
}
}
if(t==0)//没找到0,即第一个1(地位算起)向高位中没有找到0,就像111111,11111000,
n=(t1<<1)+pow(2,c-1)-1;
cout<<n<<endl;
}
return 0;
}