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

12次阅读

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

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

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 会抛异常,所以调用前确保两个数都是正整数
  • 返回类型与输入类型一致,但内部运算按公共类型提升(如 intlong 混用时按 long 算)
#include  int x = 100, y = 75; int result = std::lcm(x, y); // 返回 300

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

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

立即学习C++免费学习笔记(深入)”;

  • 不要假设输入范围小,优先用 long long 接收中间结果
  • 对用户输入或外部数据,务必检查是否 > 0
  • std::lcm 时捕获 std::domain_error,而不是靠注释提醒“别传 0”

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

text=ZqhQzanResources