C++17起推荐直接使用std::lcm(定义在中),它自动处理类型提升、零值检查并抛出std::domain_error;若不可用,则手写迭代GCD并坚持“先除后乘”顺序防溢出。

用 std::gcd 配合公式直接算 LCM
C++17 起标准库提供了 std::gcd,求 LCM 就很简单:LCM(a, b) = a * b / GCD(a, b)。但要注意整数溢出——a * b 可能超出 int 范围,哪怕最终结果不会溢出。
- 先用
static_cast提升乘法精度,再除以gcd - 推荐用
std::lcm(C++17),它内部已处理溢出和类型适配 - 若编译器不支持 C++17,自己实现时务必先除后乘:
a / gcd(a,b) * b
int a = 48, b = 18; int g = std::gcd(a, b); // C++17 int lcm = (a / g) * b; // 安全:先除后乘,避免中间溢出
手动实现 GCD 再算 LCM(兼容老标准)
如果项目必须用 C++11/14,std::gcd 不可用,就得手写欧几里得算法。注意递归版易栈溢出,迭代版更稳妥;同时要保证输入为正整数,否则 % 行为未定义。
- 函数参数建议用
unsigned int或加断言检查非零正数 - 迭代 GCD 比递归更省内存,也避免大数导致的栈溢出
- 计算 LCM 时仍坚持「先除后乘」顺序
int gcd(int a, int b) {
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}
int lcm(int a, int b) {
return a / gcd(a, b) * b; // 不是 (a * b) / gcd(...)
}使用 std::lcm(C++17 及以上最简方案)
std::lcm 是标准给出的现成接口,头文件是 。它会自动做类型提升、检查零值并抛出 std::domain_error,比手写鲁棒得多。
- 必须包含
#include - 传入 0 会抛异常,所以调用前确保两个数都是正整数
- 返回类型与输入类型一致,但内部运算按公共类型提升(如
int和long混用时按long算)
#includeint x = 100, y = 75; int result = std::lcm(x, y); // 返回 300
常见错误:溢出、负数、零输入
实际代码中栽跟头的往往不是算法逻辑,而是边界情况。比如把 int 当成“够用”,结果 1e5 和 1e5 的 LCM 是 1e10,远超 int 上限(约 2e9);又或者没校验输入,传了 0 进去导致除零或异常。
立即学习“C++免费学习笔记(深入)”;
- 不要假设输入范围小,优先用
long long接收中间结果 - 对用户输入或外部数据,务必检查是否 > 0
- 用
std::lcm时捕获std::domain_error,而不是靠注释提醒“别传 0”
真正难的不是写出一个能跑的 LCM 函数,而是让它在各种输入下都不崩、不静默错、不溢出——这些细节藏在类型选择、运算顺序和错误检查里。











