a、b的最大公倍数 = a * b / a、b的最大公约数
最大公约数用更相减损法来求,即让两个数相减,然后用差和减数的较大值和较小值更新被减数和减数,直到被减数和减数相等为止,此时被减数就是最大公约数。
#include <bits/stdc++.h> using namespace std; // 利用最大公倍数和最大公约数的关系 // 两个数的最大公倍数 = 两个数相乘 / 最大公约数 // 例:8和10的最大公约数==2,最大公倍数=8*10/2=40 // 求最大公约数的方法是辗转相减法,将两个数相减,然后取减数和差相减 int greatestcommondivisor(int a, int b) { // 求a和b的最大公约数Minus and minuend int minuend = max(a, b); // 被减数 int minus = min(a, b); // 减数 int difference = 0; while (minus != minuend) { difference = minuend - minus; minuend = max(minus, difference); minus = min(minus, difference); } return minus; } int main() { int a, b; while (cin >> a >> b) { int gcdivisor = greatestcommondivisor(a, b); // 最大公约数 cout << a * b / gcdivisor << endl; } return 0; }
递归写法
#include <bits/stdc++.h> using namespace std; // 利用最大公倍数和最大公约数的关系 // 两个数的最大公倍数 = 两个数相乘 / 最大公约数 // 例:8和10的最大公约数==2,最大公倍数=8*10/2=40 // 求最大公约数的方法是辗转相减法,将两个数相减,然后取减数和差相减 int func(int minuend, int minus) { if (minuend == minus) return minuend; int difference = minuend - minus; return func(max(minus, difference), min(minus, difference)); // 这个递归貌似并没有重复计算 // 这道题中的原问题和子问题有相同的问题结构,是指都是两者相减,直到两者相等 } int main() { int a, b; while (cin >> a >> b) { // int gcdivisor = greatestcommondivisor(a, b); // 最大公约数 int gcdivisor = func(max(a, b), min(a, b)); cout << a * b / gcdivisor << endl; } return 0; }