проблема бесконечного цикла, когда я пытаюсь получить общий делитель JavaScript - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь получить ближайший общий делитель некоторых чисел, но по какой-то причине код попадает в бесконечный цикл и задаюсь вопросом, почему. Например, предположим, что у меня есть числа 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 ]

0 голосов
/ 10 января 2019

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]))
0 голосов
/ 10 января 2019

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]));

Более эффективные методы расчета LCM можно найти в Wikipedia

...