栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

YBT 1223 An Easy Problem

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

YBT 1223 An Easy Problem

题目描述

输入若干个 n n n,对于每一个 n n n,输出最小的一个比它大 m m m,并且使它们在二进制下拥有相同的 1 1 1

题目分析

我们可以这样处理每一个 n n n:先加上这个 n n n的 l o w b i t lowbit lowbit,然后再从最末位逐个添加 1 1 1直到 1 1 1的个数相等。以题目中的例子来说明, 78 78 78的二进制是 1001110 1001110 1001110,先加上它的 l o w b i t lowbit lowbit即 10 10 10得到 1010000 1010000 1010000,然后再逐个添加末位的 1 1 1使它 1 1 1的个数与原数一样得到 1010011 1010011 1010011即 83 83 83。

Code
#include
#include
#define lb(x) ((x)&(-(x)))
#define ll long long
using namespace std;
ll n;
ll cot(ll x){
	ll sum=0;
	while(x){
		x-=lb(x);
		++sum;
	}
	return sum;
}
ll solve(ll x){
	ll res=lb(x),num=cot(x);
	x+=res;
	if(cot(x)==num)return x;
	ll i=1;
	while(cot(x)!=num){
		x+=i;
		i<<=1;
	}
	return x;
}
int main(){
	scanf("%lld",&n);
	while(n!=0){
		printf("%lldn",solve(n));
		scanf("%lld",&n);
	}
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/766931.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号