一个计算器,只能乘2和减1

版权声明:本文为博主原创文章,转载请注明原文链接 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();
	
   }

}

猜你喜欢

转载自blog.csdn.net/qq_36922927/article/details/82355520
今日推荐