版权声明:本文为博主原创文章,转载请注明原文链接 https://blog.csdn.net/qq_36922927/article/details/82355520
现有一个奇葩的计算器,只能执行乘2和减1操作,现在给定任意两个数字
m,n,其中m,n范围是 1<=m,n<=10^9
解决方式:
分情况讨论:
1,m=n 结果为0
2,m>n 结果为 m-n
3,m<n
3.1 m<2*n-1 m-=1
3.2 m>=2*n-1 m*=2
c++代码实现:
1,循环实现
int solution(int m, int n) {
int count = 0;
while (m != n) {
if (m < n) {
if (n < 2 *m-1) {
m -= 1;
}
else {
m = 2 * m;
}
count++;
}
else if(m>n){
count+=m-n;
m=n;
}
}
return count;
}
输入样例:4,5输出3
1,16 输出 4
2,递归实现:
// 问题描述经过有限次的-1,乘2操作,得到n,输出最少的次数
// m,n
// 1, m>n 直接返回m-n
//2, m=n 直接返回0
//m<n
//
int solution(int m, int n) {
if (m > n) {
return m - n;
}
else if (m == n) {
return 0;
}
else {//m<n
//处理优先 减还是乘的问题 输入 4,5 运算步骤是4-1,再*2 ,再-1 输出3
// 为什么2*m-1>n就采用-1呢?如果是采用乘再减一好像也是没啥毛病
//就以4,5为例:
2*m-1=7>n=5
// 先乘:m*=2=8 count=1
//m=8>n=5,执行m-n count+=m-n=1+3=4
//
if (2 * m - 1 > n) {
return 1 + solution(m - 1, n);
}
else {
return 1 + solution(2 * m, n);
}
}
}
int main()
{
while (1) {
int m,n = 0;
std::cin >> m;
std::cin >> n;
std::cout << "结果:" << m << "," << n <<":"<< solution(m, n)<<std::endl;
std::cin.clear();
}
}