首页 > 试题广场 >

最后剩下的数是多少

[单选题]
0,1,2,3,⋯,499,500共501个数按升序排列,每次取奇数序位的数丢掉,然后取剩下的数的奇数序位的数丢掉,重复这个过程,那么最后剩下的数是多少?
  • 249
  • 253
  • 255
  • 257
  • 499
  • 不同于以上答案
推荐
答案是C
           其实你可以推导一下,我以前类似的题目有推导过的过程,过程比较麻烦,故我在此不细推导,总结下来就是接近末尾这个数的最大的数是2的n次方比如末尾是65,那么剩下就是64,末尾是127也是64,是130就是128,当然这都是从1开始,这个题目从0开始,故而是255
编辑于 2015-09-15 12:39:16 回复(2)
留下的首位0 1 3 7 15 63 这串数字的规律是 前一项×2+1 算出500以下的最大值
发表于 2021-08-14 19:14:28 回复(0)
yql头像 yql
     简单例举下:0   1    2    3    4  5    6    7    8    9   10    11
    第一次剩下的    1    3    5    7  9    11       规律: 2i-1     
                            ( i为整数   1<=i<= n/2 (n表示给出序列的元素个数,例子中是12,而题目中是501))
    第二次剩下的    3     7    11                               4i- 1                    1<=i<= n/4
    第3次剩下的        7                                           8i- 1                     1<=i<= n/8

    相信已经差不多了。每次剩下的元素为   2^x-1满足条件的只有255=2^8-1.当然这是选择题可以直接选答案。
    正确做法是: 最后剩下一个元素,那么进行了几次筛选过程呢?   i取值只能是1,  
    那么 501/(2^x)<2    取x=8;
    那么剩下的元素是2^8-1=255
编辑于 2015-09-19 14:44:35 回复(4)
都是一的二进制数最后出列。每次出的都是末尾是0的二进制序列。
发表于 2015-09-18 18:43:03 回复(1)
啥头像



写了验证代码如下:
whoLeft()是按照笨方法写的
whoLeft2()是按照上述方法写的
相互验证结果一致。
#include <iostream>
#include <vector>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

using namespace std;

int whoLeft(unsigned int num);
int getBits(unsigned int num);
int whoLeft2(unsigned int num);

int main()
{
    srand((unsigned)time(NULL));
    for(int i=0; i<10; i++) {
        int num = rand()%1000;
        cout << whoLeft(num) << endl;
        cout << whoLeft2(num) << endl;
        cout << endl;
    }
}

int whoLeft2(unsigned int num)
{
    // 取得num二进制有几位
    int bits = getBits(num+1);
    return pow(2, bits-1)-1;
}

int whoLeft(unsigned int num)
{
    // 初始化状态数组
    vector<bool> state(num+1, true);

    // 取得num二进制有几位
    int bits = getBits(num+1);

    // 筛选
    for(int i=0; i<bits-1; i++) {
        int j=0;
        bool deleted = true;
        while(j<=num) {
            if(state[j] == true) {
                if(deleted == true) {
                    state[j] = false;
                }
                deleted = !deleted;
            }
            j++;
        }
    }

    // 查找
    for(int i=0; i<=num; i++) {
        if(state[i] == true) {
           return i;
        }
    }
    return -1;
}

// 获取num的二进制有多少位
int getBits(unsigned int num)
{
    int res = 0;
    while(num > 0) {
        res++;
        num = num >> 1;
    }
    return res;
} 


发表于 2015-10-12 16:53:24 回复(3)
谁的二进制1的个数多,谁留下
发表于 2016-09-10 16:56:19 回复(0)
题目可以看成是二进制数向右移位,每次出来一位,因此各位全部是1的最后出来,即是剩下的数。
发表于 2016-09-09 15:45:17 回复(0)
第1次留下的是2n-1;
第2次留下的是4n-1;
第3次留下的是8n-1;
...
最后留下的是256n-1, n只能取1,也就是255
发表于 2019-06-11 21:59:39 回复(0)
每次出列下标都除2取上整,因此可以知道最后一个数的下标肯定是2的幂,500以内最大为256,即255
编辑于 2017-09-19 12:17:17 回复(0)
首先去掉奇数,剩下偶数(都是2^1的倍数),再次操作,剩下的都是2^2的倍数,如此反复,最后剩下的就是2^n的倍数,知道剩下一个,为小于最大数的2^n。
编辑于 2015-09-24 09:54:35 回复(0)
2^n中n最大的数会被保留下来,500以内的数是256,从0开始数就是255
发表于 2015-09-19 00:19:47 回复(0)
陈年老题了,推荐排除法,第一次去掉了所有偶数 剩下了1,3,5,7.....第二次去掉的全部是1+4*n 选项中只有255不在这个范围,其他选项全被去掉了
发表于 2021-01-25 23:38:43 回复(0)

var a=[]; for(var i=0;i<501;i++){
    a.push(i); } var remove = function(arr) { if (arr.length <= 1) { return arr;  } for(var i= arr.length;i>=0;i--){ if(i%2==0){
        arr.splice(i,1)
    }
} return remove(arr); } console.log(remove(a));

编辑于 2018-09-05 11:24:59 回复(0)
给每项加1,变成1.2.3......,256拥有的因子2最多,得出是256在用256减1,为255
发表于 2017-10-13 23:04:41 回复(0)
首先去掉偶数,剩下的奇数统统加一,序列变为2468……,该序列统统除以2后,去掉奇数部分,重复这个过程,也就是说,最后剩下的那个数是一个纯偶数,可以完全由2乘出来,发现是256,还原回去,减掉一个1,答案是255
编辑于 2024-03-13 17:09:52 回复(0)
最开始有501个数,去除奇数位后,余250个,0+2-1=1,得出第一位数
去除奇数位,余125个,0+4-1=3,得出第一位数
去除奇数位,余62个,0+8-1=7,得出第一位数
去除奇数位,余31个,0+16-1=15,得出第一位数
去除奇数位,余15个,0+32-1=31,得出第一位数
去除奇数位,余7个,0+64-1=63,得出第一位数
去除奇数位,余3个,0+128-1=127,得出第一位数
去除奇数位,余1个,0+256-1=255,即最后剩余的一位数
编辑于 2022-11-13 09:57:13 回复(0)
将数字转化为2进制表示:000,001,010,011,100,101,110,111……

第一次去掉的是最后一位为0的数字,即(000,010,100,110……),剩下的数字中第一个为001,即2^1-1
第二次去掉的是倒数第二位为0的数字,即(001,101……),剩下的数字中第一个数字为011,即2^2-1.
……
第n次去掉的是倒数第n位为0的数字,剩下的数字中第一个数字为2^n-1(后面的n个数字都不能为0)。
最后只剩下一个数字,也就是最后剩下的数字中的第一个数字:即2^8-1=256-1=255
发表于 2019-10-24 20:23:26 回复(0)
特值法猜出来的
发表于 2018-04-04 18:23:01 回复(0)
本题解题思路: 满足条件的数,转换成二进制必须是每一位都是1
发表于 2017-11-27 18:58:06 回复(0)
答案为C。
解析:
1. 根据题目要求,通过举例,可得如下规律:
规律(1)如果数字的个数——n为奇数,则一次筛选后,剩下的数字个数——m=(n-1)/2;
规律(2)如果数字的个数——n为偶数,则一次筛选后,剩下的数字个数——m=n/2;
通过以上两个规律,可以得到总的筛选次数。
如本题:501-》250-》125-》62-》31-》15-》7-》3-》1
总共经历了8次筛选。
规律(3)如果经历筛选的次数为i,那么最后剩下的数字的序位号为2^i
则,本题中,i=8,最后剩下数字的序位号为2^8 = 256
而数字从0开始计数,所以第256位上的数字位255.
发表于 2017-03-20 18:09:06 回复(0)
x=0+2^0+2^1+2^2+2^3.....<500;
所以x=255;
发表于 2015-09-15 20:38:27 回复(0)