贝利信息

c++中如何求两个正整数的最小公倍数_c++计算LCM的方法

日期:2026-01-06 00:00 / 作者:穿越時空
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 范围,哪怕最终结果不会溢出。

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 不可用,就得手写欧几里得算法。注意递归版易栈溢出,迭代版更稳妥;同时要保证输入为正整数,否则 % 行为未定义。

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 x = 100, y = 75;
int result = std::lcm(x, y); // 返回 300

常见错误:溢出、负数、零输入

实际代码中栽跟头的往往不是算法逻辑,而是边界情况。比如把 int 当成“够用”,结果 1e51e5 的 LCM 是 1e10,远超 int 上限(约 2e9);又或者没校验输入,传了 0 进去导致除零或异常。

真正难的不是写出一个能跑的 LCM 函数,而是让它在各种输入下都不崩、不静默错、不溢出——这些细节藏在类型选择、运算顺序和错误检查里。