Мой алгоритм неправильный или он правильный и просто нуждается в настройках? - PullRequest
0 голосов
/ 04 июля 2018

<html><head></head>
<body><script>
  function GCD(a, b) {
    if (a == 0) {
      return b;
    }
    return GCD(b % a, a);
  }

  function difference(array) {
    for (var i = Math.min(...array) + 1; i < Math.max(...array); i++) {
      array.push(i);
    }
    array.sort((a, b) => a - b);
  }

  function smallestCommons(arr) {
    difference(arr);
    console.log(arr);
    a = arr[arr.length - 1];
    b = arr[arr.length - 2];
    var LCM = a * b / GCD(a, b);
    while (true) {
      var index = arr.findIndex(element => LCM % element !== 0);
      if (index === -1) {
        return LCM;
      }
      LCM *= arr[index];
      console.log(LCM);
    }
  }
  smallestCommons([1, 5]) // right 
  smallestCommons([2, 10]) // right
  smallestCommons([1, 13]) // wrong
  smallestCommons([23, 18]) // wrong
</script></body>
</html>

Это код для этого вызова: https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/smallest-common-multiple/

Алгоритм, который я использую:

1-Рассчитать LCM двух самых больших чисел.

2- Попробуйте число LCM% на всем массиве, и если вы найдете число, которое не возвращает 0, присвойте его индексу var и умножьте его * LCM, затем продолжайте делать это до тех пор, пока оно ничего не найдет, и вместо этого возвращает -1, когда это произойдет, верните LCM наконец.

Код работает на первых двух массивах, но он не работает на последних двух, что заставило меня задуматься, является ли мой алгоритм неправильным, и я просто трачу свое время, пытаясь настроить его, или это правильно, и ему просто нужно немного твики?

Обратите внимание, что есть 3 разные функции, первая функция вычисляет GCD для последующего вычисления LCM, затем вторая функция помещает значения между двумя значениями в массиве и затем сортирует его, а третья функция вычисляет LCM (Lowest Common Multiple )

Проблема в том, что последние вторые массивы:

smalllestCommons ([1, 13]) возвращает 4324320 вместо 360360

smalllestCommons ([23, 18]) возвращает 72681840 вместо 6056820

Итак, что я хочу знать, пожалуйста, сосредоточьтесь на этом:

Является ли весь мой путь (алгоритм) неправильным, и мне нужно переписать целый или нужны некоторые настройки для работы?

Пожалуйста, не давайте мне готовых кодов. Просто скажите мне, что я хочу знать, и спасибо (:

1 Ответ

0 голосов
/ 04 июля 2018

Вы неправильно умножаете на arr[index].

Пусть для ясности поменяет наши переменные:

N = массив [индекс]
p = GCD (LCM, N)

теперь мы можем переписать N и LCD как:

N = p × q
LCM = p × r

для наименьшего числа, являющегося наименьшим общим кратным текущего LCM и N, его необходимо вычислить как:

LCM: = p × q × r

Но если вы рассчитаете его с кодом

LCM *= arr[index];

вы на самом деле рассчитываете

LCM: = (p × r) × (p × q) = p × p × q × r

т.е. один p фактор слишком много. Чтобы рассчитать его по мере необходимости, вы должны использовать следующий код:

LCM *= arr[index] / GCD(LCM, arr[index]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...