美团2016招聘笔试 奇数位丢弃

题目链接: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\n", (b >> 1) - 1);
12     }
13     return 0;
14 }
View Code

猜你喜欢

转载自www.cnblogs.com/zaq19970105/p/10753167.html
今日推荐