原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5491
题目大意:
T组测试数据。
L,S1,S2。
L的二进制中有x个1,x满足 S1<=x<=S2
求满足S1<=x<=S2的下一个数。
思路:
将L转化为二进制数,然后从L+1找 找符合条件的 或者 找到x<S1的。
若找到x>S2,则跳过继续往下找。
前者直接输出即可。
后者从二进制低位开始将(S1-x)个0转化为1。
最后将二进制再转化为是十进制即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=40;
int main()
{
int T;
int a[MAXN];
scanf("%d",&T);
for(int k=1;k<=T;k++)
{
memset(a,0,sizeof(a));
int L,S1,S2;
scanf("%d%d%d",&L,&S1,&S2);
long long int pos,dis=0;//long long ......dis记录到哪个数(从L+1开始),与L的差值
int sum,h;//sum记录该数的二进制形式中有多少个1
do
{
dis++;
pos=L+dis;
sum=0;
h=0;
while(pos)
{
if(pos&1)
{
a[h]=1;
sum++;
}else a[h]=0;
h++;
pos>>=1;
}
if(sum<S1)
{
int add=S1-sum;
int j=0;
while(add)
{
if(a[j]==0)
{
a[j]=1;
add--;
}
j++;
}
break;
}
}while(sum<S1||sum>S2);
long long int ans=0,temp=1;//long long
for(int i=0;i<MAXN;i++)
{
if(a[i])
ans+=temp;
temp<<=1;
}
printf("Case #%d: %lld\n",k,ans);
}
return 0;
}