首页 > 解决方案 > 当我尝试获取公约数 JavaScript 时出现无限循环问题

问题描述

我试图获得一些数字的最接近的公约数,但由于某种原因,代码进入了无限循环并且知道为什么。例如,假设我有数字 2、3 和 4。在这种情况下,最接近的公约数是 12(12 % 2 = 0、12 % 3 = 0、12 % 4 = 0)。这是我的代码:

function sumFracts(l) {
  let isDivis = false;
  let divisor = 1;
  while (!isDivis) {
    divisor++;
    isDivis = true;
    l.map((v, i) => {
      v % divisor !== 0 ? isDivis = false : isDivis;
    });
  }
  return divisor
}

其中 l = [2, 3, 4] ;

请解释一下我在这里做错了什么。

标签: javascriptinfinite

解决方案


12是 的最小公倍数2, 3, 4,而不是除数。

你有你的模数倒退。在您显示的文本中12 % 2 == 0,这是正确的,但功能是 testing 2 % 12 !== 0

您也可以使用该every()方法代替map().

function lcm(l) {
  let product = l.reduce((acc, cur) => acc * cur, 1);
  for (let multiple = 1; multiple <= product; multiple++) {
    if (l.every(v => multiple % v == 0)) {
      return multiple;
    }
  }
}

console.log(lcm([2, 3, 4]));
console.log(lcm([5, 7, 11, 13]));

您可以在Wikipedia中找到计算 LCM 的更有效方法


推荐阅读