项目欧拉qn 23

project euler qn 23

本文关键字:qn 项目      更新时间:2023-09-26

完全数是其固有因数的和正好等于该数的数。例如,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);

似乎错误在于您在代码中输入的最后一个换行符(最长的一行)。

sumOfAbundance是两个丰富数的和,您确实希望限制搜索以使程序运行得更快。但是,只有在sumOfAbundance大于limit的情况下,才应该中断循环。这时你才知道你的丰富值太大了。

在另一种情况下,不应该中断循环。它检查sumOfAbundance之前是否被计数,但无论您之前是否看到过sumOfAbundance的值,如果sumOfAbundance仍然足够小,您必须继续循环

那么总结一下:在推入sumOfAbundanceArray和改变totalSum之前检查这个条件的两个部分,但是只有当sumOfAbundance太大时才跳出循环。