题意:给你一个n,找出最小的一个大于n的数m,使得n和m在二进制表示下的1的个数相同
基本位操作
#include <cstdio>
int lowbit(int i)
{
return i & -i;
}
int get_num(int n)
{
int res = 0;
while(n)
{
if(n & 1) res++;
n >>= 1;
}
return res;
}
int solve(int n)
{
int res = n, num = get_num(n);
res += lowbit(n);
int nnum = get_num(res);
if(nnum == num) return res;
for(int i = 0; i < num - nnum; i++)
res += (1 << i);
return res;
}
int main()
{
int T;
scanf("%d", &T);
for(int ca = 1; ca <= T; ca++)
{
int n;
scanf("%d", &n);
printf("Case %d: %d\n", ca, solve(n));
}
return 0;
}