算法笔记 / A LEAF IN THE GARDEN

辗转相除

算法笔记 · 算法理论 / 数论。来自 Daily Learning 的学习笔记。

最大公约数

步骤

  1. aa 对 bb 取余,得到余数 r1r_1。
  2. r1r_1 对 aa 取余,得到余数 r2r_2
  3. r2r_2 对 r1r_1 取余,得到余数 r3r_3
  4. 重复步骤 rir_i = ri−1 % ri−2r_{i-1} \space \% \space r_{i-2}
  5. 直到 rir_i 为 0,ri−1r_{i-1} 为答案

图解

设 - 为最大公约数d的长度
a = ------- (7d)
b = ----- (5d)

a %= b
a = -- (2d)
b = ----- (5d)

b %= a
a = -- (2d)
b = - (d)

a %= b
a = 0 
b = - (d)

代码

int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

最小公倍数

步骤

  1. 求出 aa 和 bb 的最大公约数 dd。
  2. 最小公倍数 ll 等于 a⋅bd\frac{a \cdot b}{d}。

代码

int lcm(int a, int b) {
    return a * b / gcd(a, b);
}