输入一个数n,把它转化为二进制后有m个1,列如5->101,m=2;
现在我们要输出一个比它大的数,并且这个数转化为二进制后,1的个数不大于m。
思路就是在二进制里做手脚,
就是换个大数,有机会的话再去点1,
然后再把二进制转化回来就ok啦
#include <stdio.h>
#include <stdlib.h>
int main()
{
long long int n,m;
int i,a[1010],l=0,j,x;
scanf("%lld",&n);
while(n>0)
{
x=n%2;
n=n/2;
l++;
a[l]=x;
}
for(j=1; j<=l; j++)
if(a[j]==1)
break;
for(i=j+1; i<=l; i++)
if(a[i]==0)
break;
if(i<=l)
{
for(j=1;j<i;j++)
a[j]=0;
a[i]=1;
}
else if(i>l)
{
for(i=1; i<=l; i++)
a[i]=0;
l++;
a[l]=1;
}
n=0;
m=1;
for(i=1; i<=l; i++)
{
if(i!=1)
m=m*2;
if(a[i]==1)
n+=m;
}
printf("%lld\n",n);
return 0;
}