Как получить числа, которые могут делить все значения в массиве - PullRequest
0 голосов
/ 22 мая 2018

Я пишу функцию, которая выдала бы число (я), которое может делить все числа в массиве.

function scf(array){
  var newarray = [];
  for (var i = 0; i < array.length; i++) {
    for (var num = 1000; num > 1; num--) {
      if (array[i] % num === 0) {
        newarray.push(num);
      }
    }
  }
  return newarray
}
scf([133, 147, 427, 266])

Однако, оно дает мне все числа, которые могут делить каждое число:

[ 133, 19, 7, 147, 49, 21, 7, 3, 427, 61, 7, 266, 133, 38, 19, 14, 7, 2 ]

И я надеялся, что он даст только числа, которые могут разделить все четыре числа в массиве (в этом случае это будет [7]).

Любая помощь, пожалуйста?

Ответы [ 5 ]

0 голосов
/ 22 мая 2018

Я думаю, что вы можете взять GCD из всех чисел в вашем массиве, что даст вам нет.который будет делить каждое нет в вашем массиве.

Более того, сложность по времени, чтобы найти gcd из двух чисел, является логарифмической, поэтому общая сложность будет O (nlog (n)), где n - это количество элементов в вашем массиве.. Также,

gcd (a, b, c) = gcd (a, gcd (b, c))

0 голосов
/ 22 мая 2018

Вы можете сохранить дух функции, но взять только одно значение, чтобы получить делители.Позже уменьшите массивы, проверив общие значения.

function scf(value) {
    var result = [],
        num;
    for (num = Math.floor(value / 2); num > 1; num--) {
        if (value % num === 0) {
            result.push(num);
        }
    }
    return result;
}

console.log(
    [133, 147, 427, 266]
        .map(scf)
        .reduce((a, b) => a.filter(v => b.includes(v)))
);
0 голосов
/ 22 мая 2018

Вы можете использовать метод filter, чтобы получить числа , которые могут разделить все значения в array.

Также используйте распространить синтаксис , чтобы найти минимальное значение из заданного вами массива и использовать его в качестве аргумента для Array.from функции, которая генерирует все 2...min значения.

function scf(arr){
  let min = Math.min(...arr);
  return Array.from(Array(min - 1)).map((_, k) => k + 2).filter(num => arr.every(item => item % num == 0));
}

console.log(scf([133, 147, 427, 266]))
0 голосов
/ 22 мая 2018
 function scf(array){
          var newarray = [];
          for (var num = 1000; num > 1; num--) {
            var count = 0;
            for (var i = 0; i < array.length; i++) {
              if (array[i] % num === 0) {
              {
                  count = count + 1;
              }
            }
            if(count==array.length)
                newarray.push(num);
          }
          return newarray;
        }
0 голосов
/ 22 мая 2018

Было бы проще сгенерировать числа от 2 до минимального значения в массиве, затем filter их с помощью теста every:

const scf = input => (
  Array.from(({ length: Math.min(...input) - 1 }), (_, i) => i + 2)
    .filter(testNum => (
      input.every(item => item % testNum === 0)
    ))
);
console.log(scf([133, 147, 427, 266]));
console.log(scf([6, 12, 18]));
...