Skip to content

计算最大公因数的算法

约 426 字大约 1 分钟

算法C

2025-09-16

欧几里得算法

具体步骤如下:用较大的数除以较小的数,得到余数;然后用较小的数除以这个余数,再次得到余数;重复这个过程,直到余数为零,此时的除数就是最大公因数。例如,对于24和36,用36除以24余12,再用24除以12余0,所以12就是它们的最大公因数。

尝试证明(并不严谨)

余数:

a=kb+ra = kb + r % \downarrow \\ % a\space\mathrm{mod}\space b = r

其中 rr 即为余数,并且有 r<b, r0r < b, \space r \ge 0.

不妨假设, gcd(a, b)\mathrm{gcd(}a,\space b \mathrm{)} (a, b 的最大公因数) 等于 dd .

那么, 容易得到, a=αda = \alpha db=βdb = \beta d,其中 α\alpha , β\beta 是两个整数.

把这俩等式代入 a=kb+ra = kb + r , 我们得到:

αd=kβd+r\alpha d = k \beta d + r

移项并整理, 不难发现:

r=(αkβ)dr = (\alpha - k \beta)d

由于 α\alpha , β\betakk 都是整数, 所以经过加减乘三种运算后得到的数仍然是整数, 所以 rr 是 a, b 最大公因数的倍数. 也就是说, dd 也是 rr 的因数.

所以, 接下来只需要求 gcd(r, b)\mathrm{gcd(}r,\space b \mathrm{)} 就可以了!

那么, 如何求 gcd(r, b)\mathrm{gcd(}r,\space b \mathrm{)} ? 只需要把 bb, rr 继续进行取余的操作(也就是把bb, rr 当作 aa, bb 进行迭代)

于是, 就得到了上面的算法.

代码实现

C Language

int gcd(int a, int b);
int gcd(int a, int b)
{
    int remainder = a < b ? b % a : a % b;
    if (remainder == 0) {
        return a < b ? a : b;
    }
    while (1)
    {
        if (a % remainder == 0 && b % remainder == 0)
            break;
        remainder = a < b ? a % remainder : b % remainder;
    }
    return remainder;
}

更新日志

2025/9/16 13:41
查看所有更新日志
  • 3caf1-docs(blog): 调整分类