最大公约数和最小公倍数
一、最大公约数
想象一下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;