一、最大公约数 greatest common divisor
最初级的方法
function gcd(a, b) {
let result = 1; //最小的公约数是1
for (let i = 1; i <= a && i <= b; i++) {
if (a % i == 0 && b % i == 0) {
result = i;
}
}
return result;
}
欧几里得算法(又称辗转相除法),可采用递归和迭代两种方法实现
该算法依赖的定理是:两个整数的最大公约数等于较小的那个数和两个整数相处余数的最大公约数。
// 假设a>b
gcd(a,b) = gcd(b,a%b)
递归
function DG(a, b) {
if (b > a) { // 排序 让较大的数在前面
let temp = a;
a = b;
b = temp;
}
if (a == b || b == 0) {
return a;
}
return DG(b, a % b);
}
迭代
迭代即一次次地循环,逼近并得到最终结果,即程序里的循环。
由于预先不知道循环几次,故采用while循环实现。
function DD(a, b) {
if (a < b) {
let temp = a;
a = b;
b = temp;
}
while (b != 0) {
let remainder = a % b;// 余数
a = b;
b = remainder;
}
return a;
}
二、最小公倍数 least common multiple
最小公倍数 = 两个数的乘积 / 最大公约数
function lcm(a, b) {
return (a * b)/gcd(a,b);
}