为什么一定会停?余数 b > a % b 严格越来越小(且都是非负整数),一路减小必然到 0,不可能无限追下去。
💻 C++ 怎么写
// 辗转相除法:递归版
int gcd(int a, int b) {
if (b == 0) return a; // 余数为 0,a 就是答案
return gcd(b, a % b); // 角色互换,继续追
}
int main() {
int a = 48, b = 18;
cout << gcd(a, b) << "\n"; // 6// 最小公倍数 = a ÷ GCD × b(先除后乘防溢出)
cout << a / gcd(a, b) * b << "\n"; // 144
return 0;
}
考点提醒:写 LCM 用 a / gcd * b 而不是 a * b / gcd,因为 a × b 可能超过 int 范围;先除一定整除,再乘就安全了。