配合《算法竞赛入门经典》第10章
最大公约数和最小公倍数
两个数的最大公约数通常写成gcd(a, b),最小公倍数写成 lcm(a, b)。
最大公约数*最小公倍数 = 两数的乘积 gcd(a,b) * lcm(a,b) = a*b
求两个数的最大公约数最有名的方法就是辗转相除法, 又名欧几里德算法(Euclidean algorithm)。它是已知最古老的算法, 其可追溯至3000年前。
计算a = 1071和b = 462的最大公约数的过程如下:从1071中不断减去462直到小于462(可以减2次,即商q0 = 2),余数是147:
1071 = 2 × 462 + 147.
然后从462中不断减去147直到小于147(可以减3次,即q1 = 3),余数是21:
462 = 3 × 147 + 21.
再从147中不断减去21直到小于21(可以减7次,即q2 = 7),没有余数:
147 = 7 × 21 + 0.
此时,余数是0,所以1071和462的最大公约数是21。
在C语言中,使用递归求 gcd 是极为简洁又高效的办法。