题型:数论
题意:给出一个n,求比n的大的最小的一个数,满足其二进制数中的1的个数和n的二进制中的1的个数相等。
分析:
找出n的二进制数最右边连续的1,然后将这一块中最左边的1左移以为,其余全部右移至最右边。
思想很简单,代码更优雅。
代码:
#include <cstdio>
int main(){
int n,x;
while(scanf("%d",&n),n){
x=n&-n;
printf("%d\n",n+x+(n^n+x)/x/4);
}
}