【算法竞赛】数学专题:01.辗转相除法(欧几里得算法)求最小公倍数
辗转相除法的关键在于:
** gcd(a,b) = gcd(b,a mod b)**
再加上边界条件:
** gcd(a,0) = a**
构成以下程序:
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
注:
- a,b 两个参数的相对大小无要求,可通过一次函数调用就实现 a 为大数, b为小数。
- 以上程序可以扩写为:
int gcd(int a, int b)
{
int tmp;
while (b != 0)
{
tmp = a % b;
a = b;
b = tmp;
}
return a;
}
3.利用gcd(最大公约数)求lcm(最小公倍数):
由 gcd(a,b) * lcm(a,b) == a * b
得 lcm(a,b) = a / gcd(a,b) b;
正确的写法是先除后乘,避免 a*b 溢出*。
4.gcd算法的递归层数较小,不会出现栈溢出。递归层数不超过 4.785lgN + 1.6723, N=max(a,b).