首页 > 试题广场 >

n 从 1 开始,每个操作可以选择对 n 加 1,或者对 n

[单选题]
n 从 1 开始,每个操作可以选择对 n 加 1,或者对 n 加倍。如果最后结果为 2013,最少需要( )个操作。
  • 18
  • 24
  • 21
  • 不可能
将2013转换为二进制为:10111011111;其中,1要做2次操作(减1和 除以2 ), 0要做1次操作( 除以2 ,最左边的1做0次操作(初始为1)。设1数量为x,0数量为y,则num = 2*(x-1)+y。(除以2在二进制里是右移一位)
发表于 2016-04-19 18:59:39 回复(7)

2013 = 1006 * 2 + 1(2次)

1006 = 503 * 2(1次)

503 = 251 * 2 + 1(2次)

251 = 125 * 2 + 1(2次)

125 = 62 * 2 + 1(2次)

62 = 31 * 2(1次)

31 = 15 * 2 + 1(2次)

15 = 7 * 2 + 1(2次)

7 =  3 * 2 + 1(2次)
3 =  1 * 2 + 1(2次)

共18次,选A

发表于 2015-11-10 20:17:41 回复(3)
将2013转换为二进制为:10111011111;其中遇到1除以2,遇到0减1,即有公式num = 2*(x-1)+y,其中x为二进制中1的个数,y为二进制中0的个数,则有num = 18.
发表于 2015-11-30 20:10:10 回复(2)
#include<iostream>
using namespace std;
int main() 
{
    int n=2013,cnt=0;
    while(n!=1)
    {
        cout<<n<<endl;
        n=n&1>0?n-1:n/2;    
        cnt++;
    }
    cout<<cnt<<"次"<<endl;
    return 0;
}

答案: A。

本题最容易想到的方法就是直接进行运算,采用反推的方法,
从1到2013只允许执行加1操作或者加倍操作,
那么从2013到1就只允许减1操作或者减半操作。具体步骤如下:
由于2013是奇数,不能被2整除,此时对2013执行减1操作,变为2012,2012为偶数,
能够被2整除,此时执行减半操作,变为1006,1006为偶数操作,
于是继续执行减半操作,按照奇数减1,偶数减半的操作一直执行下去,
最终结果就变为1了。
整个过程如下:2013->2012->1006->503->502->251->250->125->124->62->31->30->15->14-> 7->6->3->2->1,
此过程一共执行了18次。所以,正向推理过程也为18次。
因此,选项A正确。
编辑于 2018-07-15 11:31:09 回复(3)
可以倒着算,遇到偶数除2,奇数减1
  1. 2013
  2. 2012
  3. 1006
  4. 503
  5. 502
  6. 251
  7. 250
  8. 125
  9. 124
  10. 62
  11. 31
  12. 30
  13. 15
  14. 14
  15. 7
  16. 6
  17. 3
  18. 2最开始就是1,所以一共是18个操作
发表于 2021-07-31 12:07:54 回复(0)
我就服这些解答的人,二进制的结果都写错了,都是一个老师教的吗?
发表于 2018-08-21 21:48:31 回复(1)
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
    int n=2013,cnt=0;
    while(n!=1)
    {
        n=n&1>0?n-1:n/2;
        cnt++;
    }
    cout<<cnt<<endl;
    return 0;
} 

发表于 2017-08-04 09:13:23 回复(0)
楼下2013转换二进制余数不是逆序输出吗?我都怀疑自己了,还特意百度了下!汗颜。。。。
发表于 2017-09-08 21:17:55 回复(0)
最少操作 也就是说每次都尽量有较大幅度增加。2n大于n+1(除非n=1)。所以能*2尽量都*2 也就是偶数都*2。逆推:2013—2012—1006—503—502—251—250—125—124—62—31—30—15—14—7—6—3—2—1。 共18次。
发表于 2022-02-16 16:28:14 回复(0)
2013转化为二进制为10111011111,初始值为1<<10,再|8次1
发表于 2018-02-27 18:04:33 回复(0)
将2013转换为二进制为:11111011101,其中,1要做2次操作(减1和 除以2 ), 0要做1次操作( 除以2  ,最左边的1做0次操作(初始为1)。设1数量为x,0数量为y,则num = 2*(x-1)+y。
发表于 2020-09-10 16:12:13 回复(0)
考虑了一下直接强算,因为所有的操作是只能加1或者加倍,
2013=2*1006+1(2次)
1006=2*503(1次)
503=2* 251+1 (2次)
251=2*125+1(2次)
125=2*62+1(2次)
62=2*31(1次)
31=2*15+1(2次)
15=2*7+1 (2次)
7=2*3+1(2次)
3=2*1+1(2次)
1  
所以总次数=2*8+2=18次
发表于 2019-02-09 16:03:05 回复(0)
QNN头像 QNN

先将2013转化为二进制,10111011111。如果末位为0,此时为偶数,右移,相当于除以二。如果末位为1,此时为奇,需要先置0,再右移,这里有两步。直至最后只剩一个1。因此,1的个数减一的二倍,再加上0的个数,(9-1)• 2 + 2 = 18。

发表于 2018-07-09 12:24:50 回复(0)
代码实现:
public int  GetStep(int val) {
int step=0;
while(val>1){
String string=Integer.toBinaryString(val);
if(string.charAt(string.length()-1)=='1'){
val--;
step++;
}
else{
val=val>>1;
step++;
}
}
return step;
}
发表于 2016-10-20 20:18:22 回复(0)
转化为二进制的过程和直接倒推花的时间差不多,本质是一样的。
发表于 2016-05-27 22:46:25 回复(0)
虽然楼上的方法可以推算出来,但是应该不是这么得出结果的吧。
求解答。
发表于 2015-11-11 16:19:26 回复(1)