Этот код дает 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.