题目链接:https://www.nowcoder.com/questionTerminal/196141ecd6eb401da3111748d30e9141?source=relative
题目大意:
略
分析:
转自:https://www.nowcoder.com/profile/198826
因为是从0开始,所以第一轮移走的是二进制下最右边为0的位置(从0开始的偶数位置)上的数,然后我们发现第二轮各个number的位置等于number/2,即从number位置到number>>1位置,这时候我们依然移走二进制下最右边为0的位置(1(01) 5(101) 9(1001) ……它们第二轮对应的位置是0, 2, 4),最后剩一个数肯定是0到n中二进制下1最多的那个数,因为它每次的位置都是奇数位置。
代码如下:
1 #include <cstdio> 2 3 int main() 4 { 5 int n; 6 while(scanf("%d", &n) != EOF){ 7 int b = 1; 8 while(b <= n + 1){ 9 b <<= 1; 10 } 11 printf("%d ", (b >> 1) - 1); 12 } 13 return 0; 14 }