因此,我正在测试我的算法,并试图打印一个范围内的所有素数。我认为代码是合乎逻辑的,但它总是打印错误的输出,即未经过滤的数字列表。
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);发布于 2022-04-12 04:51:58
几乎没有什么问题。首先,j应该开始与2相等。否则,它将看到每个值都有一个因子1。如果我们不遍历整个b[j]跨度,而只是到item,我们也可以跳过检查,以确保item不是b。另一个主要问题是return true和return 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));
https://stackoverflow.com/questions/71837229
复制相似问题