位运算模拟
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main ()
{
int t, cnt = 1;
scanf("%d", &t);
while(t--)
{
int n;
scanf("%d", &n);
int i = 0;
int a = 0;
while(!((1<<i)&n) || (1<<(i+1))&n)//算一下需要向高位移动一位的位置i
{
if((1<<i)&n) a++;//i的右边有多少个1
i++;
}
n ^= (1<<i)^(1<<(i+1));//将i位置的1向高位移动一位
int j = 0;
while(j < i)//i右边的a个1尽可能靠右边放(这样值最小)
{
if(a) n |= (1<<j), a--;//如果a个1没有放完,继续放
else if(n&(1<<j)) n ^= (1<<j);//a个1放完了,其他i右边的位置归零
j++;
}
printf("Case %d: %d\n", cnt++, n);
}
return 0;
}