最大公约数与最小公倍数的 C++ 实现
在数论和算法竞赛中,最大公约数(GCD)与最小公倍数(LCM)是高频考点。理解它们的数学原理并掌握高效的代码实现,对解决更复杂的组合问题至关重要。
核心概念
公约数是指两个或多个整数共有的因数。最大公约数即其中最大的一个。例如 12 和 18 的公约数有 1, 2, 3, 6,其中最大的是 6。
关于 LCM,有一个重要定理:
a × b = gcd(a, b) × lcm(a, b)
因此,只要算出 GCD,LCM 可以直接通过 a * b / gcd(a, b) 推导得出。注意计算乘积时可能溢出,建议先除后乘。
常用求解算法
1. 辗转相除法(欧几里得算法)
这是最经典且高效的方法。原理基于:gcd(a, b) = gcd(b, a % b)。当余数为 0 时,除数即为最大公约数。
#include <iostream>
using namespace std;
// 迭代版本:效率最高,避免栈溢出
int gcd(int a, int b) {
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}
// 递归版本:逻辑直观,适合理解原理
int gcd_recursive(int a, int b) {
if (b == 0) return a;
return gcd_recursive(b, a % b);
}
int main() {
int a = 18, b = 12;
cout << "GCD: " << gcd(a, b) << endl;
return 0;
}


