C++17起推荐直接使用std::lcm(定义在中),它自动处理类型提升、零值检查并抛出std::domain_error;若不可用,则手写迭代GCD并坚持“先除后乘”顺序防溢出。
std::gcd 配合公式直接算 LCMC++17 起标准库提供了 std::gcd,求 LCM 就很简单:LCM(a, b) = a * b / GCD(a, b)。但要注意整数溢出——a * b 可能超出 int 范围,哪怕最终结果不会溢出。
static_cast 提升乘法精度,再除以 gcd
std::lcm(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; // 安全:先除后乘,避免中间溢出
如果项目必须用 C++11/14,std::gcd 不可用,就得手写欧几里得算法。注意递归版易栈溢出,迭代版更稳妥;同时要保证输入为正整数,否则 % 行为未定义。
unsigned int 或加断言检查非零正数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
int 和 long 混用时按 long 算)#includeint x = 100, y = 75; int result = std::lcm(x, y); // 返回 300
实际代码中栽跟头的往往不是算法逻辑,而是边界情况。比如把 int 当成“够用”,结果 1e5 和 1e5 的 LCM 是 1e10,远超 int 上限(约 2e9);又或者没校验输入,传了 0 进去导致除零或异常。
long long 接收中间结果std::lcm 时捕获 std::domain_error,而不是靠注释提醒“别传 0”真正难的不是写出一个能跑的 LCM 函数,而是让它在各种输入下都不崩、不静默错、不溢出——这些细节藏在类型选择、运算顺序和错误检查里。