如何修复此代码以获取范围内的所有素数



所以我正在测试我的算法,并尝试打印一个范围内的所有素数。我认为代码是合乎逻辑的,但它一直打印错误的输出,即未经过滤的数字列表。

function sumPrimes(num) {
// Check all numbers for primality
let a = []
let b = []
for (let i = 2; i <= num; i++) {
a.push(i)
b.push(i)
}
//console.log(a)
return a.filter(function(item) {
for(let j = 0; j < b.length; j++) {
if(item !== b[j] && item % b[j] != 0) {
return true
} 
}
return false; 
})
}
sumPrimes(977);

问题很少。第一个j应该开始等于2。否则,它将看到每个值都有一个因子1。如果我们不遍历b的整个跨度,而只遍历到item,我们也可以跳过您的检查,以确保b[j]不是item。另一个主要问题是return truereturn false是向后的。

接下来的问题是,您并不真正需要某些部件。例如,b[j]将始终等于j + 2,因此不需要构建b

function sumPrimes(num) {
// Check all numbers for primality
let a = []
for (let i = 2; i <= num; i++) {
a.push(i)
}
return a.filter(function(item) {
for(let j = 2; j < item; j++) {
if(item % j === 0) {
// j is a factor so we shouldn't keep it and instead skip it
return false;
} 
}
// We know that all of the values up to item are not factors so we keep it
return true; 
})
}
console.log(sumPrimes(977));

此外,如果我们在添加值时应用过滤,我们可以跳过向a添加每个值。

function getPrimesUpTo(num) {
let primes = [];
// Check each value
for (let i = 2; i <= num; i++) {
let hasFactors = false;
// Search for any factors before adding it to our list of primes
for (let possibleFactor = 2; possibleFactor < i; possibleFactor++) {
if (i % possibleFactor === 0) {
hasFactors = true;
break;
}
}

if (!hasFactors) {
primes.push(i);
}
}
return primes;
}
console.log(getPrimesUpTo(977));

最新更新