Project euler 23, дает 64 выше, чем следует - PullRequest
0 голосов
/ 06 ноября 2019

Этот код дает 64 больше, чем следовало бы, мне известны вопросы о дублировании, но ни одно из этих решений не исправляет мое.

https://projecteuler.net/problem=23

Идеальное число - эточисло, для которого сумма его собственных делителей точно равна числу. Например, сумма правильных делителей 28 будет равна 1 + 2 + 4 + 7 + 14 = 28, что означает, что число 28 является идеальным.

Число n называется дефицитным, если суммаего собственные делители меньше n, и он называется обильным, если эта сумма превышает n.

Поскольку 12 - это наименьшее число с обилием, 1 + 2 + 3 + 4 + 6 = 16, наименьшее число, которое может бытьзаписывается как сумма двух чисел, равных 24. Математическим анализом может быть показано, что все целые числа больше 28123 могут быть записаны как сумма двух чисел, встречающихся в большом количестве. Однако этот верхний предел не может быть уменьшен в дальнейшем анализом, хотя известно, что наибольшее число, которое не может быть выражено как сумма двух чисел, меньше этого предела.

Найдите сумму всехцелые положительные числа, которые нельзя записать как сумму двух чисел.

const abundantNumbers = [];
let result = 0;

const isItAbundant = number => {
  let divisorsSum = 1;
  for (let i = 2; i <= Math.sqrt(number); i++) {
    if (number % i === 0) {
      divisorsSum += i;
      divisorsSum += number / i;
    }
  }
  if (Math.sqrt(number) % 1 === 0) {
    divisorsSum -= Math.sqrt(number);
  }

  return divisorsSum > number ? 1 : 0;
};

const populateAbundantNumbers = () => {
  for (let i = 12; i < 28123; i++) {
    if (isItAbundant(i)) {
      abundantNumbers.push(i);
    }
  }
};

const arrayCanSumToX = numb => {
  const length = abundantNumbers.length;
  let low = 0;
  let high = length;

  while (low < high) {
    if (abundantNumbers[low] + abundantNumbers[high] === numb) {
      return true;
    } else if (abundantNumbers[low] + abundantNumbers[high] < numb) {
      low++;
    } else {
      high--;
    }
  }
  return false;
};

const checkIfProductOfTwoAbundant = () => {
  for (let i = 1; i < 28123; i++) {
    if (!arrayCanSumToX(i)) {
      result += i;
    }
  }
  return result;
};

populateAbundantNumbers();
checkIfProductOfTwoAbundant();
// => 4179935

// Gives 64 higher than correct solution.

1 Ответ

1 голос
/ 07 ноября 2019

Кажется, что в функции arrayCanSumToX есть 2 ошибки:

  • , когда high начинается с length, abundantNumbers[high] выходит за пределы.
  • замена low < high на low <= high позволяет взять одно и то же численное число дважды, как в примере 24 = 12 + 12.

Предлагаемое изменение:

const arrayCanSumToX = numb => {
  const length = abundantNumbers.length;
  let low = 0;
  let high = length-1;

  while (low <= high) {
    if (abundantNumbers[low] + abundantNumbers[high] === numb) {
      return true;
    } else if (abundantNumbers[low] + abundantNumbers[high] < numb) {
      low++;
    } else {
      high--;
    }
  }
  return false;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...