题目:
假设有这样一个计算器,该计算器只有两个按钮,按下第一个按钮能使显示数值减少1,按下第二个按钮能使显示数值乘以2,当前显示数值为N, 那么至少要按多少次按钮才能显示数值编程M?
输入:输入两个整数N和M,1≤N,M≤109。
输出:是显示数值变成M的最少按钮次数。
样例输入:
4 5
样例输出:
3
思路1:
将计算器按的过程看做一个二叉树,左结点为减1的结果,右结点为 乘以2的结果。定义一个队列,将层序遍历的结果压入队列。## 标题 ##
代码:
#include <iostream>
#include<vector>
#include<queue>
using namespace std;
int Number(int &n, int &m)
{
if (n >= m)
return (n - m);
queue<int> qu;//定义队列,并将n压入
qu.push(n);
int k = qu.front();//定义变量指向队首元素
int i = 0;//编号
while (k != m)
{
k = qu.front();
qu.pop();
qu.push(k - 1);//左结点
qu.push(k * 2);//右结点
i++;
}
return (int)(log(i)/ log(2));//(int)(log(i) / log(2))+1是树的深度
}
int main()
{
int N, M;
cin >> N;
cin >> M;
cout << Number(N, M);
system("pause");
return 0;
}
思路2:
int Number2(int &n, int &m)
{
int step=0;
if (n >= m)//只走减1的路线
return (n - m);
else
{
while (m != n)
{
if (m % 2 == 0 && m > n)//只走乘以2的路线
{
m = m / 2;
step++;
}
else//两种情况都有,继续分
{
if (n >= m)//只走减1的路线
{
step = step + (n - m);
break;
}//两种情况都有,两步
m = (m + 1) / 2;
step = step + 2;
}
}
}
return step;
}