lightoj1042

来源:互联网 发布:java单例模式面试题 编辑:程序博客网 时间:2024/06/07 00:05

位运算模拟

代码如下:

#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;}