最大公约数和最小公倍数
最大公约数,指某几个整数共有因子中最大的一个
最小公倍数,指某几个整数所有共有倍数中最小的一个
- 最大公约数:
使用辗转相除法。及两个数,较大数与较小数相除取余,然后与较小数与余数消除取余,余数与新余数取余…一直到能整除为止,那么最后一个余数就是最大公约数。
let num1 = 210;
let num2 = 66;
210 % 66 = 12;
66 % 12 = 6;
12 & 6 = 0;
// 最大公约数为 6
- 最小公倍数:
最小公倍数等于两个数的乘积,除以最大公约数。
let num1 = 210;
let num2 = 66;
210 * 66 / 6 = 2310;
// 最小公倍数为 2310;
最大公约数
// 求两个数最大公约数
function gcd(...param){
return param[0] % param[1] ? gcd(param[1], param[0] % param[1]) : param[1]
}
// 求多个数最大公约数
function gcdMultiple(...param){
let arr = [...param];
// arr.forEach(d => {
// if(arr.length > 1) arr.push(gcd(arr.pop(),arr.pop()))
// })
while (arr.length > 1) {
arr.push(gcd(arr.pop(), arr.pop()))
}
return arr[0];
}
最小公倍数
// 求两个数最小公倍数
function lcm(...param) {
return param[0] * param[1] / gcd(param[0], param[1]);
}
// 求多个数最小公倍数
function lcmMultiple(...param){
let arr = [...param];
// arr.forEach(d => {
// if(arr.length > 1) arr.push(lcm(arr.pop(),arr.pop()))
// })
while (arr.length > 1) {
arr.push(lcm(arr.pop(), arr.pop()))
}
return arr[0];
}
Question:
细致的你,一定看到在lcmMultiple,gcdMultiple方法中,有被注释掉的forEach循环代码。因为此处forEach的循环是达不到预期的,所以导致函数执行有问题。细节原因虽有大概猜测,但由于没细致研究就不过多讲述了。希望有经验的大神,可以帮忙解释下。如果你希望自己研究下,下面的demo代码供你测试使用。
let arr = [11,22,33,44,55,66];
for(var d=0;arr.length > 1;d++){
if(arr.length > 1){console.log(arr);arr.pop();arr.push(arr.pop())}
}
arr = [11,22,33,44,55,66];
arr.forEach((d, i) => {
if(arr.length > 1){console.log(arr);arr.pop();arr.push(arr.pop())}
})
(完)