代码之家  ›  专栏  ›  技术社区  ›  Ciprian

当我尝试获取共除数javascript时,出现无限循环问题

  •  0
  • Ciprian  · 技术社区  · 6 年前

    我试图得到一些数字中最近的公除数,但由于某种原因,代码进入了一个无限循环,并给出了原因。例如,假设我有数字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];

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

    2 回复  |  直到 6 年前
        1
  •  0
  •   Barmar    6 年前

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

    你的模数倒过来了。在文本中显示 12 % 2 == 0 ,正确,但功能正在测试 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

        2
  •  0
  •   Vadim Hulevich    6 年前

    function sumFracts(l) {
        let isDivis = false;
        let divisor = 1;
        while (isDivis===false) {
            divisor++;         
            isDivis = l.every(el=>((divisor % el) == 0));                  
        }
        return divisor
    }
    
    console.log(sumFracts([2, 3, 4]))