project euler qn 23

时间:2016-09-11 15:39:45

标签: javascript algorithm

完美数字是一个数字,其正确除数的总和恰好等于数字。例如,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);

1 个答案:

答案 0 :(得分:0)

似乎错误在于你进入代码的最后一次休息(最长的一行)。

sumOfAbundance是两个数字的总和,实际上你想限制搜索以使程序运行得更快。但是 - 只有在sumOfAbundance大于limit的情况下才应该打破循环。那时你知道你的丰富价值太大了。

在条件的另一种情况下,你应该打破循环。它检查之前是否计算过sumOfAbundance,但无论你之前是否看过sumOfAbundance的值,如果sumOfAbundance仍然足够小,你必须继续循环

总结一下:在推送到sumOfAbundanceArray并更改totalSum之前检查这个条件的两个部分,但是只有当sumOfAbundance太大时才会退出循环。