1. 最小公倍数问题概述
求最小公倍数(LCM)是编程入门阶段常见的数学问题,也是各类OJ平台的基础题型。HJ108作为华为机试中的一道经典题目,主要考察选手对基础算法的掌握程度和代码实现能力。在实际工程应用中,最小公倍数计算在调度系统、周期任务协调、信号同步等领域都有广泛用途。
最小公倍数与最大公约数(GCD)有着密不可分的关系。根据数学定理,两个数a和b的最小公倍数等于它们的乘积除以最大公约数,即LCM(a,b) = (a×b)/GCD(a,b)。这个关系式将问题转化为如何高效求解最大公约数。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法解析
2.1 辗转相除法原理
辗转相除法(欧几里得算法)是求解GCD的最高效方法之一。其基本原理是:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。用递归方式可以表示为:
code复制GCD(a, b) = GCD(b, a mod b)
当余数为0时,当前的除数就是GCD。例如计算GCD(48,18):
- 48 ÷ 18 = 2余12
- 18 ÷ 12 = 1余6
- 12 ÷ 6 = 2余0
因此GCD为6。
2.2 算法实现优化
基础实现容易理解但存在递归深度问题。更优的实现应采用迭代方式:
python复制def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
对于LCM的计算,需要注意整数溢出问题。可以先计算GCD再使用公式:
python复制def lcm(a, b):
return a * b // gcd(a, b)
2.3 边界条件处理
实际编码时需要特别注意:
- 输入含0的情况(0与任何数的LCM为0)
- 负数的处理(应先取绝对值)
- 大数运算时的溢出(Python无此问题,但C/Java需要注意)
3. 完整代码实现
3.1 Python版本
python复制def gcd(a, b):
while b:
a, b = b, a % b
return a
def lcm(a, b):
return a * b // gcd(a, b)
if __name__ ==
