求助站外题
  • 板块灌水区
  • 楼主very_easy
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/3/23 22:19
  • 上次更新2024/3/24 08:42:42
查看原帖
求助站外题
838926
very_easy楼主2024/3/23 22:19

多组数据,给一个数,求第一个比它大且二进制中1的个数相同的数,n≤109n \le 10^9

大体思路:从最后一个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;
}

请大佬指出错误,或给出反例

2024/3/23 22:19
加载中...