题目大意:给定一个数,求一个比它大的数,使得他们二进制一的个数相同并且那 个数要最小;
题目解析:考虑他的后缀肯定会出现011...1100...00的形式,我们需要做的就是把红色的0变成1,然后统计后面1的个数,设为n,去掉一个1,并且把所有1右移至顶端,最后形如100...00011...11的形式,注意如果所有字母都是1或者是11...1100...000的形式,要在最左端添加一个1;
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
ll n,temp;
int main()
{
int c,cas,i,posi,posj,flagi,flagj,cnt,flag,ans;
scanf("%d",&cas);
for(c=1;c<=cas;c++)
{
scanf("%lld",&n);
temp=n;
posi=-1;
flagi=0;
posj=-1;
flagj=0;
cnt=0;
flag=0;
ans=0;
while(n!=0)
{
if(n%2==1)
{
posi=cnt;
flag=1;
flagi=1;
}
if(n%2==0&&flagi==0)
{
ans++;
}
if(n%2==0&&flagj==0&&flag==1)
{
posj=cnt;
flagj=1;
}
n/=2;
if(flagi==1&&flagj==1)
break;
cnt++;
}
if(posj==-1)
posj=cnt;
printf("Case %d: %lld\n",c,temp+(1<<(ans))+(1<<(posj-ans-1))-1);
}
return 0;
}