首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >euler qn 23项目

euler qn 23项目
EN

Stack Overflow用户
提问于 2016-09-11 15:39:45
回答 1查看 99关注 0票数 1

完全数是指它的适当除数之和与其数完全相等的一个数。例如,28的适当除数之和为1+2+4+7+ 14 = 28,这意味着28是一个完美数。

如果一个数n的适当除数之和小于n,则称为亏,如果这个数大于n,则称它为富足数。

由于12是最小的富足数,1+2+3+4+6= 16,可以写成两个富足数之和的最小数是24。通过数学分析,可以证明所有大于28123的整数都可以写成两个丰富数的和。然而,这个上限不能通过分析进一步降低,即使已知不能表示为两个丰富数之和的最大数小于这个极限。

找出所有正整数的和,这些正整数不能写成两个丰富数的和。

问题:我的答案似乎比正确的4179871要大得多,如果有人指出我代码中的错误,我会很感激的。非常感谢!

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-11 17:04:17

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

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

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

因此,最后:在推进到sumOfAbundanceArray和更改totalSum之前,检查这个条件的两个部分,但是只有当sumOfAbundance太大时,才能脱离循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39437800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档