公约数和公倍数
什么是最大公约数
在信息学竞赛(OI)里,最大公约数(Greatest Common Divisor,简称 gcd)指的是两个或多个整数共有约数里最大的那个。例如,12 和 18 的公约数有 1、2、3、6,其中最大公约数是 6。在 C++ 里,计算两个数的最大公约数是一个常见操作,gcd 算法能够高效地算出两个整数的最大公约数。其功能不仅局限于单纯的数学计算,在很多算法和问题的求解中,最大公约数都扮演着关键角色。
辗转相除法
计算最大公约数最常用的算法是欧几里得算法(辗转相除法),其原理基于以下定理: 对于任意两个正整数 a 和 b(a > b),它们的最大公约数等于 b 和 a % b(a 除以 b 的余数)的最大公约数,即 gcd(a, b) = gcd(b, a % b)。
证明
设 ,显然有 。设 ,则 。
由右边的式子可知 为整数,即 ,所以对于 的公约数,它也会是 的公约数。
反过来也需要证明:
设 ,我们还是可以像之前一样得到以下式子 。
因为左边式子显然为整数,所以 也为整数,即 ,所以 的公约数也是 的公约数。
既然两式公约数都是相同的,那么最大公约数也会相同。
所以得到式子
当 b 为 0 时,a 和 0 的最大公约数就是 a,这就是算法的终止条件。

代码实现
题面
给定两个正整数 a 和 b,求出它们的最大公约数。
输入输出样例
- 输入: 一行,包含两个正整数 a 和 b,用空格分隔。
示例输入:
- 输出: 输出一个整数,表示 a 和 b 的最大公约数。
示例输出:
代码实现
示例代码
复杂度分析
时间复杂度
欧几里得算法的时间复杂度是 。这是因为在每一次递归调用中,两个数中的较大数至少会减少一半。可以通过数学推导证明,在最坏情况下,每次递归后,问题规模会以指数级的速度缩小,所以总的递归次数是对数级别的。
空间复杂度
由于使用了递归实现,递归调用会使用系统栈空间,空间复杂度是 ,主要取决于递归的深度。
什么是最小公倍数
定义
一组整数的公倍数,是指同时是这组数中每一个数的倍数的数。0 是任意一组整数的公倍数。
一组整数的最小公倍数,是指所有正的公倍数里面,最小的一个数。
对整数 ,将其最小公倍数记为 ,不引起歧义时可简写为 。
对整数 ,将其最小公倍数记为 ,不引起歧义时可简写为 。
计算
设 ,
我们发现,对于 和 的情况,二者的最大公约数等于
最小公倍数等于
由于
所以得到结论是
要求两个数的最小公倍数,先求出最大公约数即可。