将一个数字化为二进制,并算出这个二进制数所含‘1’的个数,求出最小的比这个数大的并含相同‘1’个数的数。
先将二进制数转化成 string,再用next_permutation() 即可。不过还有一种情况,就是这个二进制数已经是最后一个排列了,这时候就要给原二进制加上一位数了,具体做法体现在代码中。
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
__int64 cvt(string a){
__int64 result = 1;
for(int i = 1; i < a.size(); i++){
if(a[i] == '0')
result = (result << 1);
else
result = (result << 1 | 1);
}
return result;
}
int main(){
int N, caseNo = 0;
cin >> N;
while(N--){
__int64 T, onoroy = 0;
string strT = "";
cin >> T;
while(T){
if(T % 2 == 1){
onoroy++;
strT.insert(0, "1");
}else{
strT.insert(0, "0");
}
T /= 2;
}
if(!next_permutation(strT.begin(), strT.end())){
strT.insert(0, "10");
strT.erase(strT.size() - 1, 1);
}
cout << "Case " << ++ caseNo << ": " << cvt(strT) << endl;
}
}