【算法竞赛】数学专题: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);
}

注:

  1. a,b 两个参数的相对大小无要求,可通过一次函数调用就实现 a 为大数, b为小数。
  2. 以上程序可以扩写为:
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).

posted @ 2022-02-19 21:27  github_user  阅读(118)  评论(0)    收藏  举报