我应该编写一种算法,该算法返回所有素数之和直到一定数量(自变量),包括自变量本身。这段代码似乎运行良好(我在较小的数字上进行了测试),但是一定存在一个错误,因为当我通过 977 作为参数时,程序将返回 108789 ,这可能是不正确的。根据freecodecamp.org的说法,它应该返回 73156 。在添加值之前,我已经检查了数组,但是在这里看不到问题。
function sumPrimes(num) {
function isPrime(n){
return ((n/2 === 1 || n/3 === 1 || n/5 === 1 || n/7 === 1)?true:
(n%2===0 || n%3 === 0 || n%5 ===0 || n%7 === 0)?
false:true);
};
let result = [];
let final;
for(let i = 2; i <= num; i++){
if(isPrime(i)){
result.push(i);
}
}
final = result.reduce((x,y) => x + y);
console.log(final); // returns 108789
}
sumPrimes(977);
答案 0 :(得分:3)
您的isPrime()方法不正确。您可以改为执行以下操作。
编辑:@Amadan指出,算法的复杂度从O(n)降低到O(sqrt(n))
function sumPrimes(num) {
function isPrime(n){
for(let i = 2, k = Math.sqrt(n); i <= k; i++)
if(n % i === 0)
return false;
return true;
};
let result = [];
let final;
for(let i = 2; i <= num; i++){
if(isPrime(i)){
result.push(i);
}
}
final = result.reduce((x,y) => x + y);
console.log(final); // returns 73156
}
答案 1 :(得分:2)
您的isPrime
是完全错误的。首先,只检查前四个素数的可除性;您应该检查所有素数的可除性,直到确定要测试的数字的平方根。 (如果您现在不想打扰非质数的排序,也可以使用非质数测试。)其次,余数是否为1
没什么区别-仅在{ {1}}而非重要的0
。
素数测试的算法是众所周知的,并且在整个Web上都有描述。首先,请看prime numbers上的Wikipedia进行概述,以及here来了解我假设您要使用的特定算法,尽管对于您的特定用例(所有质数之和小于N), Sieve of Eratosthenes应该更好。
答案 2 :(得分:0)
您的isPrime()函数不正确。如果您想处理除小小的素数以外的任何事情,就不能简单地对素数进行硬编码以进行检查。例如isPrime(143)将返回true,但是143 = 11 * 13则不是素数。
答案 3 :(得分:0)
您的主要功能无法正常工作,您可能需要阅读stackoverflow answerlink有关构建一个功能的信息。但是,您其余的功能似乎按预期运行。
答案 4 :(得分:0)
您使用的方法是错误的,因为它仅检查一定数量的值,这对于大数而言是有问题的。
如上面的答案之一所述,遍历所有数字直到该数字的平方根也是有效的方法,但是还有一种更快,更有效的方法,称为Eratosthenes筛网。
此方法可用于删除我们已经知道为假的结果,而不对其进行计算。
您可以在这里详细了解- Sieve of Eratosthenes