您的位置:首页 > 其它

Same binary weight

2015-05-13 14:15 351 查看

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 integerN,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
思路没想出来,看得别人的:
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
转自:点击打开链接
先看看这几个例子:1717(0110 1011 0101),下一位是 1718(0110 1011 0110)767(0010 1111 1111),下一位是 895(0011 0111 1111)348(0001 0101 1100),下一位是 355(0001 0110 0011)其中不难发现一个规律,从右起的第一个“01”改变为“10”,并且在“01”的后面所有的“1”都移动至最后,事实上,这个就是解题的关键点,那么整个问题求解的核心就转移到这两个子问题:1. 将右起第一个“01”,改变为“10”2. 将该“01”后面的所有“1”移动至最后
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
#include<iostream>#include<string>#include<cstring>using namespace std;int main(){int n;while(cin>>n){int a[50];memset(a,0,sizeof(a));// 变为二进制int f = 0;while(n){a[f++]=n%2;n/=2;}// 找 1 0 的位置 变为 0 1int key = 0;for(int i = 0; i <= f; i ++){if(a[i]==1 && a[i+1]== 0){key = i -1;a[i]=0;a[i+1]=1;break;}}//  key 之前有多少个一int count = 0;for(int i = 0; i <= key; i ++){if(a[i]==1) count++;}// 变为 1for(int i = 0;i < count; i ++){a[i]=1;}// 变为 0for(int i = count;i <= key; i ++ ){a[i]=0;}// 变为十进制int h = 1;int sum = 0,i = 0;f++;while(f--){sum+=h*a[i++];h*=2;}cout << sum << endl;}return 0;}
位运算貌似更好:[/code]

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: