多组数据,给一个数,求第一个比它大且二进制中1的个数相同的数,n≤109
大体思路:从最后一个1开始加,将进位1的数量在最后补上
输入: 2 4 78
输出 8 83
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
string to2(int n){//10进制转二进制
string ans;
while(n){
ans=(n%2?'1':'0')+ans;
n/=2;
}
return ans;
}
int to10(string a){//2->10
int w=1,ans=0;
for(int i=a.size()-1;i>=0;i--){
ans+=(a[i]-'0')*w;
w*=2;
}
return ans;
}
int lowbit(int n){
return n&-n;
}
int log(int n){
int ans=0;
while(n){
n/=2;
ans++;
}
return ans;
}
signed main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
string a=to2(n);
int k=log(lowbit(n));
int i=a.size()-k,cnt=0;
if(i==0){
cout<<n*2<<endl;//2的整数次幂特判
continue;
}
while(i>=0&&a[i]=='1'){
cnt++;
a[i]='0';
i--;
}
cnt--;
if(i==-1){//二进制表示全1
int ans=n+1;//先变成整数次幂再加上缺少的1的个数
string tmp;
for(int i=1;i<=a.size()-1;i++){
tmp+='1';
}
cout<<ans+to10(tmp)<<endl;
continue;
}
a[i]='1';//常规情况
string tmp;
for(int i=1;i<=cnt;i++){
tmp+='1';
}
cout<<to10(tmp)+to10(a)<<endl;
}
return 0;
}
请大佬指出错误,或给出反例