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

今天开始准备做个系列,专门存快速简洁的算法代码。当然了,共享是必需的!

 

如果只用到 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值