贝壳C++后台——两个数,一个数到另一个数的最少步骤

Posted huangfuyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贝壳C++后台——两个数,一个数到另一个数的最少步骤相关的知识,希望对你有一定的参考价值。

【题目】假设有这样一个计算器,只有两个按钮,一个按钮使显示的数字减少1,另一个按钮使显示的数字乘以2。当显示的数值为N,那么至少要按多少次按钮才能使显示的数值变成M?

输入:两个整数N和M,1<=N,M<=10^9.

输出:使显示数值变成M的最少按钮次数。

样例:4 5

输出:3

 

 

【分析】这个问题很有趣,正向思维这个4怎么变成5,不如逆向思维5需要怎样的步骤而来,因为计算器就两个功能。

1、在N<M情况下,5只可能是一个大于等于5的数减来的;(奇数+1,偶数不加)

2、这个比5大的数,只能是一个比5小的数乘来的;(需要是个偶数)

3、这个比5小的数有可能介于N和M之间,若是小于N,那就简单了。需要的步骤是N减去这个数;

4、介于之间的时候,需要递归的再递归1、2步,直到小于N。

代码:

 1 #include <iostream>
 2 
 3 int main(){
 4     
 5     int N, M=0;
 6     int temp=0;
 7     cin>>N>>M;
 8     if (N>=M)
 9     {
10         cout<<N - M;
11         return 0;
12     }
13     do{
14         if (M % 2 == 1)
15         {
16             M = (M + 1) / 2;
17            //需要两步,乘以2,再加1
18             temp += 2;
19         }
20         else
21         {
22             M /= 2;
23             temp += 1;
24         }
25       } while (M > N);
26     cout<<temp+(N-M);
27 
28     return 0;
29 }

小学数学奥赛题!

 

以上是关于贝壳C++后台——两个数,一个数到另一个数的最少步骤的主要内容,如果未能解决你的问题,请参考以下文章

Java_打印从一个数到另一个数之间的整数,并每5个为一行

C++中一个数的最大因子怎么找?

网易校招真题 一个数变为斐波那契数列数

求数组所有区间最大值减去最小值之差的和(贝壳笔试题)

完全平方数

问题 D: 数字变换(dfs)