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
-
The input has multicases and each case contains a integer N.
#include <iostream>
#include <cstdio>
#include <cmath>
#include <bitset>
using namespace std;
int main()
{
int n,temp,i,j,counter;
while(~scanf("%d",&n))
{
/*temp=n&-n;
if(temp==n)//如果n二进制表示中只有一个1
{
printf("%d\n",(n<<1));
continue;
}*/
bitset<32> q; //32位,全为0
i=0;
//将n转成二进制
while(n)
{
if(n&1)
q.set(i);
i++;
n>>=1;
}
//下面找到从右到左第一个“01”,并置为“10”
counter=0;
for(j=0;j<i;j++)//必须循环i个,可能只有1个1 例如32 64 ....pow(2,i)
{
if(q.test(j))
{
counter++;
q.reset(j);
if(!q.test(j+1))//找到“01”首个立即退出
{
q.set(j+1);
break;
}
}
}
for(j=0;j<counter-1;j++)//最后1的个数应该是counter-1个
q.set(j);
// printf("%lu\n",q.to_ulong());
cout<<q.to_ulong()<<endl;
}
return 0;
}
神一样的代码:和上面的思路一样
#include <iostream>
#include <cstdio>
#include <cmath>
#include <bitset>
using namespace std;
int main()
{
int x,b,t,c,m,r;
while(scanf("%d",&x)!=EOF)
{
b=x&(-x);//b的值是:只保留最低位的1,前面的1全部置0
t=x+b;//t的值是:将x第一个01变成10,并将后面的全部变成0
c=x^t; //异或,将,第一个01变成11,前边的置0,后面的保留
m=(c>>2)/b;//将c向右移(2+log2(b))即10后面1的个数(记录在m中)
r=t|m; //t的末尾置 log2(m+1)个1
printf("%d\n",r);
}
}
主要借助于:第一个” 01“后面的 那几个1都必定连续的(或者没有)。