辗转相除法(欧几里得演算法)

240 阅读3分钟

1. 介绍

辗转相除法也称为欧几里得演算法,该方法可以用于求两个数的最大公因数(GCD)。

2. 举例:铺瓷砖

求(15, 6)的最大公因数。

该问题我们可以将其转换成铺瓷砖的问题,瓷砖只能是正方形的,而求最大公因数在此问题中就相当于找最大的一种瓷砖,能够将地面铺满。

地面的边长分别是两个数的大小6和15, 1.png 我们首先利用短边6作为正方形瓷砖的边长进行填充,可以发现填充了两块,而剩余面积无法放下第三块瓷砖, 2.png 此时剩余部分是一块边长分别为3和6的长方形,我们继续重复上述步骤,将长方形的短边3作为正方形瓷砖的边长进行填充,发现剩余部分正好可以放下两块边长为3的正方形瓷砖并且没有多余空间。 3.png 通过图形可以发现,可以使用边长为3的正方形瓷砖将整个长方形全部填充,因此得知,15和6的最大公约数是3。 4.png

3. 举例:大数求最大公因数

求(25842, 8468)的最大公因数。

我们将大数作为被除数,小数作为除数。

被除数除数余数
2584284683438
846843819146
43814630

(25842, 8468) = (8468, 438) = (438, 146)

我们通过上述表格可以观察出,每轮除法中的除数在下一轮会作为被除数,而余数会作为除数重复执行除法操作,直到余数是0为止,最终得出最大公约数为146。

4. 举例:互质数求最大公因数

求(68532, 3581)的最大公因数。

像这种大数我们很难找到他们的相同因子,因此我们可以利用辗转相除法求最大公因数。

被除数除数余数
68532358119493
35814937130
4931303103
130103127
10327322
272215
22542
5221
2120

经过一长串的计算,我们发现最终这两个数是互质数,最大公因数为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。