1. 介绍
辗转相除法也称为欧几里得演算法,该方法可以用于求两个数的最大公因数(GCD)。
2. 举例:铺瓷砖
求(15, 6)的最大公因数。
该问题我们可以将其转换成铺瓷砖的问题,瓷砖只能是正方形的,而求最大公因数在此问题中就相当于找最大的一种瓷砖,能够将地面铺满。
地面的边长分别是两个数的大小6和15,
我们首先利用短边6作为正方形瓷砖的边长进行填充,可以发现填充了两块,而剩余面积无法放下第三块瓷砖,
此时剩余部分是一块边长分别为3和6的长方形,我们继续重复上述步骤,将长方形的短边3作为正方形瓷砖的边长进行填充,发现剩余部分正好可以放下两块边长为3的正方形瓷砖并且没有多余空间。
通过图形可以发现,可以使用边长为3的正方形瓷砖将整个长方形全部填充,因此得知,15和6的最大公约数是3。
3. 举例:大数求最大公因数
求(25842, 8468)的最大公因数。
我们将大数作为被除数,小数作为除数。
| 被除数 | 除数 | 商 | 余数 |
|---|---|---|---|
| 25842 | 8468 | 3 | 438 |
| 8468 | 438 | 19 | 146 |
| 438 | 146 | 3 | 0 |
(25842, 8468) = (8468, 438) = (438, 146)
我们通过上述表格可以观察出,每轮除法中的除数在下一轮会作为被除数,而余数会作为除数重复执行除法操作,直到余数是0为止,最终得出最大公约数为146。
4. 举例:互质数求最大公因数
求(68532, 3581)的最大公因数。
像这种大数我们很难找到他们的相同因子,因此我们可以利用辗转相除法求最大公因数。
| 被除数 | 除数 | 商 | 余数 |
|---|---|---|---|
| 68532 | 3581 | 19 | 493 |
| 3581 | 493 | 7 | 130 |
| 493 | 130 | 3 | 103 |
| 130 | 103 | 1 | 27 |
| 103 | 27 | 3 | 22 |
| 27 | 22 | 1 | 5 |
| 22 | 5 | 4 | 2 |
| 5 | 2 | 2 | 1 |
| 2 | 1 | 2 | 0 |
经过一长串的计算,我们发现最终这两个数是互质数,最大公因数为1,但是同样可以发现辗转相除法的魅力,我们只需要去计算除法取余即可,没必要进行穷举的操作。
5. 总结
如果想要求两个数的最大公因数,通过上述两个例子,我们发现使用辗转相除法可以很轻易的求出最大公因数。
计算方式也极其简单,只需要将每轮除法中的除数在下一轮中作为被除数,余数作为除数重复操作,知道余数为0为止,此时的除数就是最大公约数。
并且我们仔细观察,可以发现当余数不为0时,(被除数,除数) 的最大公约数和 (除数,余数) 的最大公约数是一样的。
因此可以得出计算公式:GCD(a, b) = GCD(b, a%b) 。
6. 使用代码实现
// 返回值为最大公因数
int most_division(int a, int b) {
int r = 0;
// 令a为大数,b为小数
if(b < a) {
a = a + b;
b = a - b;
a = a - b;
}
while(a % b != 0) {
r = a % b;
a = b;
b = r;
}
return b;
}
7. 扩展
当我们了解到了最大公因数如何求,我们也可以尝试一下最小公倍数,这里直接给出公式:LCM(a, b) = (a * b) / GCD(a, b),即两数相乘除以最大公因数。
例如:LCM(15, 12) = (15 * 12) / GCD(15, 12) = 180 / 3 = 60。