首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Euler #23项目。Javascript。为什么我会得到这个错误STATUS_BREAKPOINT?

Euler #23项目。Javascript。为什么我会得到这个错误STATUS_BREAKPOINT?
EN

Stack Overflow用户
提问于 2022-11-30 15:26:31
回答 1查看 47关注 0票数 1

完全数是指它的适当除数之和与其数完全相等的一个数。例如,28的适当除数之和为1+2+4+7+ 14 = 28,这意味着28是一个完美数。如果一个数n的适当除数之和小于n,则称为亏,如果这个数大于n,则称它为富足数。由于12是最小的富足数,1+2+3+4+6= 16,可以写成两个富足数之和的最小数是24。通过数学分析,可以证明所有大于28123的整数都可以写成两个丰富数的和。然而,这个上限不能通过分析进一步降低,即使已知不能表示为两个丰富数之和的最大数小于这个极限。找出所有正整数的和,这些正整数不能写成两个丰富数的和。

我一直在尝试使用JavaScript来解决这个问题,但是我不断地得到上面提到的错误,并且我还没有弄清楚原因。我怀疑这是因为循环,但似乎没有一个是无限大的。

这是我的密码:

代码语言:javascript
复制
'use strict';

const limit = 28123;

function findProperDivisors(n) {
    let divisors = [];
    for (let i = n-1; i != 0; i--) {
        if (n % i === 0) {
            divisors.push(i);
        }
    }
    return divisors;
}

function sumDivisors(arr) {
    return arr.reduce((sum, curr) => sum + curr);
}

function isAbundunt(n) {
    return sumDivisors(findProperDivisors(n)) > n;
}

function equalsToSumOfTwoAbundants(n) {
    let divisors = findProperDivisors(n);
    for (let i = 0; i < divisors.length; i++) {
        for (let j = 0; j < divisors.length; j++) {
            if (isAbundunt(divisors[i]) && isAbundunt(divisors[j]) && (divisors[i] + divisors[j] === n)) {
                return true;
            }
        }
    }
    return false;
}

console.log(equalsToSumOfTwoAbundants(24));

let sum = 0;
// AFTER THIS LINE MY CODE BREAKS. Error code: STATUS_BREAKPOINT
for (let i = 0; i < limit; i++) {
    if (!equalsToSumOfTwoAbundants(i)) {
        sum += i;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-30 16:36:21

346398923

除了一些古怪的更大的部分,你应该从1开始循环,而不是从零开始,

代码语言:javascript
复制
for (let i = 1; i < l; i++) {

因为这是稍后通过调用findProperDivisors(0)无限循环来生成的。

代码语言:javascript
复制
for (let i = n - 1; i !== 0; i--) {

循环有简单的错误条件,这不适用于起始值低于零的情况。

其他一些暗示:

防止遍历除数的所有索引,只取丰富的值并添加检查的值,例如:

代码语言:javascript
复制
function equalsToSumOfTwoAbundants(n) {
    const
        divisors = findProperDivisors(n).filter(isAbundant);

    for (let i = 0; i < divisors.length; i++) {
        for (let j = 0; j < divisors.length; j++) {
            if (divisors[i] + divisors[j] === n) return true;
        }
    }
    return false;
}

另一个即将出现的小错误是缺少了空数组的startValue of reduce

代码语言:javascript
复制
function sumDivisors(arr) {
    return arr.reduce((sum, curr) => sum + curr, 0);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74630231

复制
相关文章

相似问题

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