最大公约数和最小公倍数

一、最大公约数

想象一下a和b是如下图所示的两根长条,它们都是整数长度:

 

然后它们的最大公约数gcd既然可以整除b,那么它一定可以整除a中包含b的那一部分:

 

那么接下来就要考虑a中多出来的那一部分。gcd一定是可以整除b和a中多出来的那一部分的。

 

一直取多余的部分,直到没有多余的部分。

 

因此算法为:

 

gcd(a, b) :

1. 将大的数置为a,小的数置为b。

2. a ← a % b

3. 若a = 0,则b就是最大公约数。

4. 否则,跳到1。

 

该算法用编程实现可以有递归和非递归两种写法。

 

非递归写法:

 

gcd(a, b) :

while (b != 0) {
temp = b;

b
= a % b;
a = temp;
}

return a;

 

递归写法:

 

gcd(a, b) :
if (b == 0) return a; return gcd(b, a % b);

 

 

二、最小公约数

最小公约数就简单了,只需两数的积除以最大公倍数。注意为防溢出,可以先除后乘。

 

lcm(a, b) :

return a / gcd(a, b) * b;

 

posted @ 2017-02-23 15:37  Envaka  阅读(402)  评论(0编辑  收藏  举报