nyoj 412 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
/** 分析: 该题是,求一个大于题目所给的数 && 其二进制中1的个数与所给的数的二进制中1的个数相同 算法1: ①、算出的二进制数从左到右遍历 ②、if 第i位数为1 && 第i + 1 位数位0: swap (A[i], A[i + 1]) pos = i break ③、将第0位到第pos位的所有1移动到最右边 **/
C/C++代码实现(算法1):
#include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <cstdio> #include <stack> #include <queue> #include <map> using namespace std; int n; int main () { while (~scanf ("%d", &n)) { int A [10000] = {0}, ans = 0, m = n, pos, k = 0, cnt = 0; while (m) { A [k ++] = m%2; m /= 2; } for (int i = 0; i < k; ++ i) { if (A [i] && !A[i + 1]) { swap (A[i], A[i + 1]); pos = i; break; } if (A[i]) ++ cnt; } for (int i = 0; i < pos; ++ i) { if (cnt) { A [i] = 1; cnt --; } else { A [i] = 0; } } for (int i = 0; i <= k; ++ i) { ans += pow (2, i) * A[i]; } printf ("%d\n", ans); } }
算法2:
/** 区别于算法一的是计算二进制的算法 ==> bitset <32> A (n) (说明:将n转换为二进制储存在A中) 二进制转换为十进制 ==> A.to_ulong() **/
C/C++实现算法2:
#include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <cstdio> #include <stack> #include <queue> #include <map> #include <bitset> using namespace std; int n; int main () { while (~scanf ("%d", &n)) { bitset <32> A (n); // 将n转化为2进制储存在A中 int pos, cnt = 0; for (int i = 0; i <= 32; ++ i) { if (A [i] && !A[i + 1]) { A [i] = 0; A [i + 1] = 1; pos = i; break; } if (A[i]) ++ cnt; } for (int i = 0; i < pos; ++ i) { if (cnt) { A [i] = 1; cnt --; } else { A [i] = 0; } } printf ("%d\n", A.to_ulong()); // 将得到的二进制转化为无符号十进制 } }