完全数是指它的适当除数之和与其数完全相等的一个数。例如,28的适当除数之和为1+2+4+7+ 14 = 28,这意味着28是一个完美数。如果一个数n的适当除数之和小于n,则称为亏,如果这个数大于n,则称它为富足数。由于12是最小的富足数,1+2+3+4+6= 16,可以写成两个富足数之和的最小数是24。通过数学分析,可以证明所有大于28123的整数都可以写成两个丰富数的和。然而,这个上限不能通过分析进一步降低,即使已知不能表示为两个丰富数之和的最大数小于这个极限。找出所有正整数的和,这些正整数不能写成两个丰富数的和。
我一直在尝试使用JavaScript来解决这个问题,但是我不断地得到上面提到的错误,并且我还没有弄清楚原因。我怀疑这是因为循环,但似乎没有一个是无限大的。
这是我的密码:
'use strict';
const limit = 28123;
function findProperDivisors(n) {
let divisors = [];
for (let i = n-1; i != 0; i--) {
if (n % i === 0) {
divisors.push(i);
}
}
return divisors;
}
function sumDivisors(arr) {
return arr.reduce((sum, curr) => sum + curr);
}
function isAbundunt(n) {
return sumDivisors(findProperDivisors(n)) > n;
}
function equalsToSumOfTwoAbundants(n) {
let divisors = findProperDivisors(n);
for (let i = 0; i < divisors.length; i++) {
for (let j = 0; j < divisors.length; j++) {
if (isAbundunt(divisors[i]) && isAbundunt(divisors[j]) && (divisors[i] + divisors[j] === n)) {
return true;
}
}
}
return false;
}
console.log(equalsToSumOfTwoAbundants(24));
let sum = 0;
// AFTER THIS LINE MY CODE BREAKS. Error code: STATUS_BREAKPOINT
for (let i = 0; i < limit; i++) {
if (!equalsToSumOfTwoAbundants(i)) {
sum += i;
}
}发布于 2022-11-30 16:36:21
346398923
除了一些古怪的更大的部分,你应该从1开始循环,而不是从零开始,
for (let i = 1; i < l; i++) {因为这是稍后通过调用findProperDivisors(0)无限循环来生成的。
for (let i = n - 1; i !== 0; i--) {循环有简单的错误条件,这不适用于起始值低于零的情况。
其他一些暗示:
防止遍历除数的所有索引,只取丰富的值并添加检查的值,例如:
function equalsToSumOfTwoAbundants(n) {
const
divisors = findProperDivisors(n).filter(isAbundant);
for (let i = 0; i < divisors.length; i++) {
for (let j = 0; j < divisors.length; j++) {
if (divisors[i] + divisors[j] === n) return true;
}
}
return false;
}另一个即将出现的小错误是缺少了空数组的startValue of reduce。
function sumDivisors(arr) {
return arr.reduce((sum, curr) => sum + curr, 0);
}https://stackoverflow.com/questions/74630231
复制相似问题