题目:
牛客网链接:求最小公倍数_牛客题霸_牛客网
描述
正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
数据范围:1≤a,b≤100000
输入描述:
输入两个正整数A和B。
输出描述:
输出A和B的最小公倍数。
示例1
输入:5 7
输出:35
示例2
输入:2 4
输出:4
解析:
首先需要理解最小公倍数的含义。公倍数,也就是能够同时被两个数整除。最小就是最小的那个数。
法1.
求解最简单粗暴的方式就是从最大的那个数开始,往上递增,直到存在被两个数整除的时候就是对应的最小公倍数了。另外,对于增长我们不可简单的++,那样效率很低下,我们可以将最大数按照其倍数进行增长,这样效率就会提高。
法2.
当然,其实最大公约数(两个数能同时整除的最大数)的辗转相除法效率很高,并且最小公倍数和最大公约数的乘积就是对应两个数的乘积。所以我们可以利用辗转相除法先求得最大公约数即可求解。
辗转相除法就是最大数除以最小数。如果能够被整除,那么较小的那个数就是最大公约数,如果不能,较小数赋值给较大数,余数赋值给较小数,重复上述过程,直到能被整除就可以找到最大公约数了。
解答:
#include <iostream>
using namespace std;
int greatCD(int a, int b)
{
// 辗转相除法求解最大公约数
if (a < b) swap(a, b);
while (a % b)
{
int tmp = a % b;
a = b;
b = tmp;
}
return b;
}
int main()
{
// 法2. 利用辗转相除法快速求解最大公约数,然后求解最小公倍数
int a, b;
while (cin >> a >> b)
{
cout << (a * b) / greatCD(a, b) << endl;
}
// 法1,最大值成倍增长,直到可被原本两数都整除为止
// int a, b;
// while (cin >> a >> b)
// {
// int max_val = max(a, b);
// int res = max_val;
// int count = 2;
// while ((res % a != 0) || (res % b != 0))
// {
// res = max_val * count;
// count++;
// }
// cout << res << endl;
// }
return 0;
}