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
来源
题目大意: 找出与目标数二进制含1数相同且比之大的最小数
解题思路:
stl 有个bitset, 可以对数进行按位操作, 只要把从低位起找到第一个1后再找到的第一个零变成1, 再把途中的1的个数减1个1放到最低位即可(不大好表述。。。), 例如101110011100->101110100011。
#include <stdio.h> #include <iostream> #include <bitset> using namespace std; int main() { int temp, i, j, count; //临时变量, 临时变量, 临时变量, 计数器 while(scanf("%d", &temp) != EOF) { count = 0; bitset<32> ans; i = 0; while(temp > 0) //将temp转化为bitset二进制保存以便操作 { ans[i] = temp & 1; temp /= 2; i++; } i = 0; while(ans[i] == 0) { i++; } while(ans[i] == 1) //找到第一个1开始计数 { ans[i] = 0; //将途中的1变为零 count++; i++; } count--; //多加了一个1, 减去 ans[i] = 1; //1以后第一个零变为1 j = 0; while(count > 0) { if(ans[j] == 0) { ans[j] = 1; //从低位开始加1 count--; } j++; } cout<<ans.to_ulong()<<endl; //用to_ulong 转化为十进制输出 } return 0; }
-
The input has multicases and each case contains a integer N.