您的位置:首页 > 其它

最大公约数(Greatest Common Divisor ) 与 最小公倍数(Lowest Common Multiple )

2012-04-01 18:35 639 查看
今天开始准备做个系列,专门存快速简洁的算法代码。当然了,共享是必需的!



如果只用到 gcd 就只需贴第一个函数,要用到 lcm 就全贴上。

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

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



2012/5/11 更新:与斐波拉契数列的关系

欧几里德算法(求最大公约数)的效率分析

欧几里德算法据说是史上第一个算法,这两个古老的算法也有重要的交集。首先给出F(n)的一个性质(可通过数学归纳法证明):



然后通过辗转相除法的定义和F(n)的这个性质可以证明:欧几里德算法求解GCD(a, b)时使用的除法次数不大于b的十进制位数的5倍。再由对数的性质可以得出欧几里德算法使用O(logb)次除法就可以求出GCD(a, b)。

(涉及很多公式书写,这里证明从略,具体过程可参考《离散数学及其应用》的3.4节)转自:http://code.zc4u.com/articles/726.html

2012/6/1

linux源码:

/* Greatest common divisor */
unsigned long gcd(unsigned long a, unsigned long b)
{
	unsigned long r;

	if (a < b)
		swap(a, b);
	while ((r = a % b) != 0) {
		a = b;
		b = r;
	}
	return b;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: