今天开始准备做个系列,专门存快速简洁的算法代码。当然了,共享是必需的!
如果只用到 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;
}