首页 > 试题广场 >

n从1开始,每个操作可以对n加1或加倍,如果要使n是2014

[填空题]
n从1开始,每个操作可以对n加1或加倍,如果要使n是2014,最少需要1个操作。
2014---1007*2---503*2+1---251*2+1----125*2+1---62*2+1---31*2---15*2+1---7*2+1---3*2+1---1*2+1
然后反推,共18步
发表于 2015-07-09 21:57:49 回复(0)
整个过程看成二进制数1通过加一和左移1位的变换来得到另一个二进制数。 11111011110要由1变换得到,必然是由1左移10次,最高位后面8个1必然是由0+1得到的,因此整个过程是由10次1的左移和8次0的加1的排列组合得到,共18步。
发表于 2015-12-06 15:06:57 回复(0)
yzh头像 yzh
发表于 2016-09-08 15:46:00 回复(2)
笨点算,反正数字也不多,直接列出来数一下就完了, 2014 1007 1006 503 502 251 250 125 124 62 31 30 15 14 7 6 3 2 1
发表于 2016-10-30 20:37:27 回复(0)
2014=11111011110,除去最高位1后为1111011110,总长度+1的个数=10+8=18
发表于 2015-09-19 23:51:32 回复(0)
以二进制形式表示。最高位1所在的位数(即不超过该数的2的最大次幂)加上其后所有1的个数之和。11111011110
发表于 2015-08-22 22:10:11 回复(4)
我的思路是通过移位的方式:2014的二进制:111110 11110 
一开始是0000 0000 0001,乘以2相当于左移一位变成0010,然后加1后是0011,如此反复形成1111是要6步,形成11110(乘以2左移一位)是7步,形成11111(加1操作)要8步
以此类推:形成11111 0 1要11步,然后以最后那个1为起始形成11110需要7步,所以11+7=18
个人的看法,抛砖引玉。
发表于 2015-09-05 10:58:24 回复(0)
int minimum_step(int n) {
    vector<int> dp(n + 1);
    dp[1] = 0;
    for (int i = 2; i <= 2014; i++) {
        dp[i] = dp[i - 1] + 1;
        if (i % 2 == 0) {
            dp[i] = min(dp[i], dp[i / 2] + 1);
        }
    }
    return dp[2014];
}

编辑于 2015-02-03 18:21:29 回复(2)
把2014变成二进制11111011110,多一个领0只需要一步(乘2),多一个1需要两步(乘二加一),故总共需要(9-1)*2+2=18步
发表于 2016-09-13 21:34:56 回复(0)
function minimumStep(n = 1) {
  // 转化为二进制,那么从0b1到0b1xxx,左移1位是x2,+1是+1
  const binary = n.toString(2);
  let zeroCount = 0;
  let oneCount = 0;
  for (let str of binary.slice(1)) {
    if (str === "0") {
      // 多一个0需要1步:+1
      zeroCount++;
    } else {
      // 多一个1需要2步:+1 x2
      oneCount++;
    }
  }

  return zeroCount + oneCount * 2;
}


编辑于 2023-11-03 21:06:28 回复(0)
nice  还是做错了
发表于 2017-12-27 13:56:50 回复(0)
对位计算的理解度,有两个基本的尝试:左移一位相当于乘以2,右移一位相当于除以2    加1不用说了。
从0000 0000 0001到0111 1101 1110,自己演练一遍好掌握,共18步!!
发表于 2016-11-14 11:29:22 回复(0)
2014的二进制表达为11111011110,除去最高位的1可以通过初始00000000001通过位移(倍数)得到以外,其他各个位置上的1仅能通过加法运算生成,所以生成一个一至少调用一次加法,供调用8次,位移运算从最低位到最高位共进行10次,所以操作数为18
发表于 2016-08-26 11:01:43 回复(0)
2014分解因式后反推:2 3 6 7 14 15 30 31 62 124 125 250 251 502 503 1006 1007 2014
发表于 2016-07-26 17:56:22 回复(0)
10
发表于 2016-07-19 14:46:38 回复(1)
从2014开始计算
2014->1007->1006->503->502->251->250->125->124->62->31->30->15->14->7->6->3->2->1
发表于 2015-10-25 13:31:25 回复(0)
为什么不是11?给1+1之后 一直加倍?不应该是11步吗?
发表于 2015-09-01 19:09:20 回复(1)
重点在于是要求正好是2014吧,过程中一定会有很多奇数,这就需要+1,所以是18
发表于 2015-07-02 08:46:01 回复(0)
羽头像
11
发表于 2014-11-19 17:48:14 回复(3)