当前位置: 首页 > news >正文

【C++练习】18.C++求两个整数的最小公倍数(LCM)

目录

  • C++求两个整数的最小公倍数(LCM)的方法
    • 方法一:利用最大公约数(GCD)计算
      • 代码实现
    • 方法二:逐次增加法
      • 代码实现
    • 方法三:质因数分解法
      • 代码实现
    • 方法比较
    • 处理大数和特殊情况
    • 改进版GCD方法实现

C++求两个整数的最小公倍数(LCM)的方法

最小公倍数(LCM)是指能够同时被两个数整除的最小的正整数。在C++中,有几种常见的方法可以计算两个整数的最小公倍数。

方法一:利用最大公约数(GCD)计算

这是最常用且高效的方法,基于数学公式:

LCM(a, b) = (a × b) / GCD(a, b)

代码实现

#include <iostream>
#include <algorithm> // 用于std::gcd (C++17及以上)// 计算GCD的函数(如果编译器不支持C++17的std::gcd)
int gcd(int a, int b) {while (b != 0) {int temp = b;b = a % b;a = temp;}return a;
}int lcm(int a, int b) {// 防止乘法溢出,先除以GCDreturn (a / std::gcd(a, b)) * b;// 或者使用自定义的gcd函数:// return (a / gcd(a, b)) * b;
}int main() {int num1, num2;std::cout << "输入两个整数: ";std::cin >> num1 >> num2;std::cout << "LCM(" << num1 << ", " << num2 << ") = " << lcm(num1, num2) << std::endl;return 0;
}

方法二:逐次增加法

这种方法通过逐个测试较大的数的倍数,直到找到能被两个数都整除的数。

代码实现

#include <iostream>int lcm(int a, int b) {int max = (a > b) ? a : b;while (true) {if (max % a == 0 && max % b == 0) {return max;}++max;}
}int main() {int num1, num2;std::cout << "输入两个整数: ";std::cin >> num1 >> num2;std::cout << "LCM(" << num1 << ", " << num2 << ") = " << lcm(num1, num2) << std::endl;return 0;
}

方法三:质因数分解法

将两个数分解质因数,然后取每个质因数的最高幂次相乘。

代码实现

#include <iostream>
#include <map>// 质因数分解函数
std::map<int, int> primeFactors(int n) {std::map<int, int> factors;if (n == 0) return factors;// 处理2的因数while (n % 2 == 0) {factors[2]++;n /= 2;}// 处理奇数因数for (int i = 3; i * i <= n; i += 2) {while (n % i == 0) {factors[i]++;n /= i;}}// 如果剩下的n是质数if (n > 2) {factors[n]++;}return factors;
}int lcm(int a, int b) {if (a == 0 || b == 0) return 0;auto factorsA = primeFactors(a);auto factorsB = primeFactors(b);// 合并两个质因数映射,取每个因数的最大指数for (const auto& pair : factorsB) {if (factorsA[pair.first] < pair.second) {factorsA[pair.first] = pair.second;}}// 计算LCMint result = 1;for (const auto& pair : factorsA) {for (int i = 0; i < pair.second; ++i) {result *= pair.first;}}return result;
}int main() {int num1, num2;std::cout << "输入两个整数: ";std::cin >> num1 >> num2;std::cout << "LCM(" << num1 << ", " << num2 << ") = " << lcm(num1, num2) << std::endl;return 0;
}

方法比较

  1. GCD方法:最有效,时间复杂度为O(log(min(a, b))),推荐使用。
  2. 逐次增加法:简单但效率低,时间复杂度为O(max(a, b)),仅适用于小数字。
  3. 质因数分解法:理论上有用,但实现复杂且效率不如GCD方法,适用于需要质因数分解的场景。

处理大数和特殊情况

在实际应用中,还需要考虑:

  • 处理负数(LCM总是正数)
  • 处理零(任何数与零的LCM是零)
  • 防止整数溢出

改进版GCD方法实现

#include <iostream>
#include <algorithm> // 用于std::gcd
#include <cstdlib>   // 用于absint lcm(int a, int b) {if (a == 0 || b == 0) return 0;// 取绝对值a = std::abs(a);b = std::abs(b);// 防止溢出,先除以GCD再相乘return (a / std::gcd(a, b)) * b;
}int main() {int num1, num2;std::cout << "输入两个整数: ";std::cin >> num1 >> num2;std::cout << "LCM(" << num1 << ", " << num2 << ") = " << lcm(num1, num2) << std::endl;return 0;
}

这种方法是最推荐的,因为它高效、简洁且能处理各种边界情况。


文章转载自:

http://qBe1HhB9.tdxnz.cn
http://Kkaww1Gd.tdxnz.cn
http://qpGds7hA.tdxnz.cn
http://PICRq8ay.tdxnz.cn
http://7ONPOmHM.tdxnz.cn
http://xoqvuSZr.tdxnz.cn
http://4HhIzfBm.tdxnz.cn
http://4Du8ZToo.tdxnz.cn
http://Co1NE7DS.tdxnz.cn
http://yPx8PYGl.tdxnz.cn
http://oJNIxPO7.tdxnz.cn
http://lbHymMzo.tdxnz.cn
http://fKQ46vwj.tdxnz.cn
http://RqsD8u8c.tdxnz.cn
http://nw1Ydpr0.tdxnz.cn
http://ND45Buku.tdxnz.cn
http://fsJQ3nOl.tdxnz.cn
http://8wUaHYO3.tdxnz.cn
http://cyRf2T5k.tdxnz.cn
http://jSYY4o1G.tdxnz.cn
http://M78I3tZo.tdxnz.cn
http://RLFx5Qgx.tdxnz.cn
http://wR7ZLpH0.tdxnz.cn
http://uCfPetu5.tdxnz.cn
http://lXBKHG0m.tdxnz.cn
http://gl2Nn3uD.tdxnz.cn
http://UyjnCeRn.tdxnz.cn
http://XSLH5MFr.tdxnz.cn
http://Hy04wI0C.tdxnz.cn
http://y3nLNAKH.tdxnz.cn
http://www.dtcms.com/a/382472.html

相关文章:

  • yolo识别手势释放忍术
  • Amass 被动与主动子域收集
  • 【左程云算法08】栈和队列相互实现
  • RocketMQ详解,消息队列实战
  • 4.6 我国股票的类型(43)
  • ​​抢占储能新高地:汇川DSP驱动软件开发范式变革与人才重塑​
  • tree 遍历目录
  • 不邻排列:如何优雅地避开“数字CP“
  • Vue3应用执行流程详解
  • css 高度从 0 到 auto 的动画效果 `interpolate-size: allow-keywords`
  • 8-获取文件和目录信息
  • SPAR类比推理模型学习(与常见小目标检测方法总结)
  • 提示工程架构师分享:如何用提示词升级职业教育的实操案例教学?(万字长文来袭,高能预警!!!)
  • C++初阶(6)类和对象(下)
  • 软件质量管理(五):ISO 9001质量管理理论到实践
  • O3.4 opencv图形拼接+答题卡识别
  • 硬件(十)IMX6ULL 中断与时钟配置
  • 格式备忘录
  • Anaconda配置环境变量和镜像
  • 健康大数据与传统大数据技术专业有何不同?
  • 《C++ Primer 第五版》this 指针 (下)
  • Python 之 Faker
  • 【问题解决】VMware +Ubuntu20.04创建用户后无法登陆的问题
  • 【底层机制】【C++】std::move 为什么引入?是什么?怎么实现的?怎么正确用?
  • 链动 3+1 模式解析:社交电商裂变的高效破局路径
  • 镀锌板数控矫平机:把“波浪”熨成“镜面”的幕后原理
  • isEmpty 和 isBlank 的区别
  • AAC ADTS格式分析
  • `Object.groupBy`将数组中的数据分到对象中
  • IACheck赋能AI环评报告审核,提升智慧交通项目合规性