首页 > 试题广场 >

n从1开始,每个操作可以选择对n加1,或者对n加倍。如果最后

[单选题]
n从1开始,每个操作可以选择对n加1,或者对n加倍。如果最后结果为2013,最少需要_____个操作。
  • 18
  • 24
  • 21
  • 不可能
//倒过来算,如果n是奇数,n-1,如果n是偶数,n/2,记录次数。

int fun(int n) {  
   int count = 0;  
   while (n > 1) {  
       if (n % 2 == 1) n--,count++;  
       else n /= 2, count++;   
   }    
  return count;
}

编辑于 2019-05-11 14:30:31 回复(0)
更多回答
推荐
换成二进制考虑,加倍就是二进制数后面放个0。
2013二进制是11111011101(手算的话,2048-32-2-1)
由于1开始,最快就是10个加倍操作,8个加1操作,选A
编辑于 2015-02-04 16:20:10 回复(10)
2013的二进制是 11111011101(9个1,2个0),则可以将原问题转换为:将此数按原来题目的要求右移,直到值为1,怎么做呢?如果末尾是1,则需要两次操作,先减去1然后右移一位,如果是0。则直接右移。所以,总次数为2*8(1)+2(0);
发表于 2015-08-21 16:18:52 回复(5)
倒推,尽量选择加倍,不行就选择加1。
2013=2012+1;2012=1006*2.。。。用f(n)表示结果为n需要最大的次数,则:
f(2013)=f(2012)+1=f(1006)+2=f(503)+3=f(502)+4=....=f(3)+16=f(2)+17  
显然,f(2)只能等于1(加倍或者加1都需要一次)!
故,f(2013)=18
发表于 2015-07-07 20:10:34 回复(0)
2013->2012->1006->503->502->251->250->125->124->62->31->30->15->14->7->6->3->2->1
数数有多少个->就可以了,每个->就是一次演变过程。

发表于 2015-09-25 15:58:02 回复(2)
package com.lris.test;

public class Test1206 {

    public static void main(String[] args) {
        int number = 2013;
        int count = 0;
        Boolean flag = true;
        
        while(flag) {
            
            int rest = number%2;
            if(rest ==1) {
                number--;
                count++;
            }else {
                number = number/2;
                count++;
            }
            if(number ==1) {
                flag = false;
            }
        }
        System.out.println("count="+count);
    }
}

发表于 2018-12-06 14:20:36 回复(0)
你们怎么保证自己的是次数最小的
发表于 2018-09-07 11:28:11 回复(1)
答案就是:二进制中1的个数*2+0的个数再减2

2013有9个1,2个0,
计算  9*2+2-2=18
发表于 2016-08-22 18:51:17 回复(0)
把加倍当做平方来算的我...
发表于 2015-11-13 14:37:59 回复(1)
倒着推也挺简单的
发表于 2015-11-10 15:50:11 回复(0)
思路和解法都对,我居然数错数了,也是醉了
发表于 2015-10-27 08:51:39 回复(0)