
前言
在算法竞赛的数学模块中,最大公约数(gcd)和最小公倍数(lcm)是当之无愧的基础核心。无论是后续的数论推导、动态规划优化,还是实际工程中的数据处理,这两个概念都扮演着不可或缺的角色。很多新手觉得数论晦涩难懂,但其实只要抓住本质、理清逻辑,gcd 和 lcm 的学习完全可以轻松上手。本文将从定义出发,深入原理,结合实战例题,用生动易懂的语言带你彻底掌握这一知识点。
一、从概念到本质:什么是约数、倍数、gcd 和 lcm?
在正式讲解算法之前,我们先明确几个最基础的概念,打好理论地基。毕竟再复杂的算法,也是基于简单概念的延伸。
1.1 约数和倍数的定义
如果一个整数 a 除以另一个整数 b(b≠0)的余数为 0,我们就说 a 是 b 的倍数,b 是 a 的约数(也叫因数),记作 b | a。比如 12 除以 3 余数为 0,那么 3 是 12 的约数,12 是 3 的倍数,写成 3 | 12。
这个概念看似简单,但有两个关键点需要注意:
约数和倍数是相互依存的,不能单独说'5 是约数'或'10 是倍数',必须明确谁是谁的约数、谁是谁的倍数;约数具有对称性,若 b 是 a 的约数,则 a/b 也一定是 a 的约数(前提是 a 能被 b 整除),这一点在后续算法优化中会起到重要作用。
1.2 最大公约数(gcd):所有公约数中的'老大'
我们先看公约数的定义:如果一个整数 d 同时是整数 a₁, a₂, ..., aₙ 中每一个数的约数,那么 d 就叫做这 n 个数的公约数。而最大公约数,就是所有公约数中最大的那个数,记作 gcd(a₁, a₂, ..., aₙ)。
举个例子:求 12、34、56 的最大公约数。首先列出它们的约数:
12 的约数:1、2、3、4、6、12;34 的约数:1、2、17、34;56 的约数:1、2、4、7、8、14、28、56;它们的公约数是 1 和 2,其中最大的是 2,所以 gcd(12,34,56)=2,这也是我们后面实战例题的一个答案。
1.3 最小公倍数(lcm):所有公倍数中的'最小鲜肉'
公倍数的定义与公约数对应:如果一个整数 m 同时是整数 a₁, a₂, ..., aₙ 中每一个数的倍数,那么 m 就叫做这 n 个数的公倍数。最小公倍数则是所有正的公倍数中最小的那个数,记作 lcm(a₁, a₂, ..., aₙ)。
比如求 4 和 6 的最小公倍数:
4 的倍数:4、8、12、16、20、24...;6 的倍数:6、12、18、24、30...;它们的公倍数有 12、24 等,其中最小的是 12,所以 lcm(4,6)=12。
1.4 gcd 和 lcm 的核心关系:相辅相成
这里有一个至关重要的性质,也是我们计算 lcm 的关键:对于任意两个正整数 a 和 b,它们的最大公约数与最小公倍数的乘积等于这两个数的乘积,即:gcd(a, b) × lcm(a, b) = a × b
这个性质的证明其实很简单(后续会简要提及),但它的实用价值极大。因为计算 lcm 直接求解比较麻烦,但如果我们能先求出 gcd,就可以通过公式 lcm(a,b) = a×b / gcd(a,b) 快速得到 lcm。需要注意的是,为了避免整数溢出(尤其是在 a 和 b 较大的情况下),我们通常会调整计算顺序,写成 lcm(a,b) = a / gcd(a,b) × b,因为 gcd (a,b) 一定能整除 a,先做除法可以保证中间结果不会超出整数范围。
二、欧几里得算法:求 gcd 的'王牌算法'
知道了 gcd 的定义,接下来就是核心问题:如何高效计算两个数的最大公约数?暴力枚举虽然可行,但效率太低,对于大数完全不适用。而欧几里得算法(又称辗转相除法),凭借其对数级的时间复杂度,成为了求解 gcd 的首选算法。




