原文链接: Same binary weight 位运算相关
上一篇: D的小L 全排列
下一篇: Registration system map的使用
Same binary weight
http://acm.nyist.net/JudgeOnline/problem.php?pid=412
时间限制:300 ms | 内存限制:65535 KB
难度:3
输入
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 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.
代码一:
#include <iostream>
#include <algorithm>
#include <deque>
using namespace std;
int main(){
int n;
while(cin>>n){
deque<int> num;
for(int i = 0; i < 32; i++)
if(n&(1<<i))
num.push_front(1);
else
num.push_front(0);
next_permutation(num.begin(),num.end());
int p = 1;
int sum = 0;
for(int i = 31; i >= 0; i--){
if(num[i]){
sum += p;
}
p *= 2;
}
cout<<sum<<"\n";
}
return 0;
}
代码二:
#include <cstdio>
//#include <iostream>
//using namespace std;
//void show(unsigned n){
// for(int i=31;i>=0;i--)
// if(n&(1<<i))
// cout<<1;
// else
// cout<<0;
// cout<<endl;
//}
int main(){
int i,j;
unsigned n;
while(scanf("%u",&n)!=-1){
for(i=0;i<32;i++)
if(n&(1<<i)) break;
for(j=i+1;j<32;j++)
if((n&(1<<j))==0) break;
//show(n);
n|=(1<<j); //first 0 to 1
//show(n);
n&=~((1<<j)-1); //1 to 0(clear)
//show(n);
n|=((1<<(j-i-1))-1); //0 to 1
//show(n);
printf("%u\n",n);
}
}
代码三:
#include <iostream>
#include <string>
#include <bitset>
#include <algorithm>
using namespace std;
int main(){
int n;
while(cin >> n){
bitset<32> bitInt(n);
string strInt =bitInt.to_string();
int pos = strInt.rfind("01");
swap(strInt[pos],strInt[pos+1]);
if(pos+2 < 31) sort(strInt.begin()+pos+2,strInt.end());
cout<<bitset<32>(strInt).to_ulong()<<endl;
}
}