完美数字是一个数字,其正确除数的总和恰好等于数字。例如,28的适当除数之和为1 + 2 + 4 + 7 + 14 = 28,这意味着28是一个完美数。
如果n的适当除数之和小于n,则n被称为不足,如果该和超过n则称为n。
由于12是最小的有限数,1 + 2 + 3 + 4 + 6 = 16,可以写成两个有限数之和的最小数是24.通过数学分析,可以看出所有大于28123的整数可以写成两个数字的总和。然而,即使知道不能表示为两个丰富数字之和的最大数量小于该限制,也不能通过分析进一步降低该上限。
找出所有正整数的总和,这些正整数不能写成两个数字的总和。
问题:如果有人在我的代码中指出错误,我的答案似乎要比正确的答案大得多,4179871。非常感谢你!
var abundanceArray = [];
var sumOfAbundanceArray = [];
var totalSum = 0;
var limit = 28123;
function checkRepeat(x) {
if (sumOfAbundanceArray.length === 0) return false;
for (var n = 0; n < sumOfAbundanceArray.length; n++) {
if (x === sumOfAbundanceArray[n]) return true;
}
return false;
}
for (var i = 1; i <= limit; i++) {
var sum = 0;
totalSum += i;
for (var j = 1; j <= Math.ceil(i/2); j++) {
if (i % j < 1) {
sum += j;
if (sum > i) {
abundanceArray.push(i);
break;
}
}
}
}
var total = abundanceArray.length;
for (var k = 0; k < total; k++) {
if (abundanceArray[k] * 2 > limit) break;
for (var l = k; l < total; l++) {
var sumOfAbundance = abundanceArray[k] + abundanceArray[l];
if (sumOfAbundance > limit || checkRepeat(sumOfAbundance) === true) break;
sumOfAbundanceArray.push(sumOfAbundance);
totalSum -= sumOfAbundance;
}
}
console.log(totalSum);
答案 0 :(得分:0)
似乎错误在于你进入代码的最后一次休息(最长的一行)。
sumOfAbundance是两个数字的总和,实际上你想限制搜索以使程序运行得更快。但是 - 只有在sumOfAbundance大于limit的情况下才应该打破循环。那时你知道你的丰富价值太大了。
在条件的另一种情况下,你应该不打破循环。它检查之前是否计算过sumOfAbundance,但无论你之前是否看过sumOfAbundance的值,如果sumOfAbundance仍然足够小,你必须继续循环。
总结一下:在推送到sumOfAbundanceArray并更改totalSum之前检查这个条件的两个部分,但是只有当sumOfAbundance太大时才会退出循环。