完全数是指它的适当除数之和与其数完全相等的一个数。例如,28的适当除数之和为1+2+4+7+ 14 = 28,这意味着28是一个完美数。
如果一个数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);发布于 2016-09-11 17:04:17
似乎错误在于您最后一次输入代码(最长的行)。
sumOfAbundance是两个丰富的数字之和,您确实希望限制搜索以使程序运行得更快。但是-只有在sumOfAbundance大于极限的情况下,才应该中断循环。那时你就知道你丰富的价值太大了。
在条件的另一种情况下,不应该中断循环。它检查sumOfAbundance以前是否被计算过,但是无论您以前是否看到过sumOfAbundance的值,如果sumOfAbundance仍然足够小,则必须继续循环。
因此,最后:在推进到sumOfAbundanceArray和更改totalSum之前,检查这个条件的两个部分,但是只有当sumOfAbundance太大时,才能脱离循环。
https://stackoverflow.com/questions/39437800
复制相似问题