JavaScript最大公约数和最小公倍数

最大公约数和最小公倍数

最大公约数,指某几个整数共有因子中最大的一个
最小公倍数,指某几个整数所有共有倍数中最小的一个

  • 最大公约数:
    使用辗转相除法。及两个数,较大数与较小数相除取余,然后与较小数与余数消除取余,余数与新余数取余…一直到能整除为止,那么最后一个余数就是最大公约数。
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())}
 })

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值