Javascript 为什么我的算法在这个数字上失败了?
我正试图写一个算法来计算小于或等于给定数字参数的素数之和。这是我的密码:Javascript 为什么我的算法在这个数字上失败了?,javascript,typescript,algorithm,Javascript,Typescript,Algorithm,我正试图写一个算法来计算小于或等于给定数字参数的素数之和。这是我的密码: function sumPrimes(num) { // populates the array with numbers uptp the given num let prime = [], i = 2; while (prime.indexOf(num) < 0){ prime.push(i) i++; } // filters the array leaving only the p
function sumPrimes(num) {
// populates the array with numbers uptp the given num
let prime = [], i = 2;
while (prime.indexOf(num) < 0){
prime.push(i)
i++;
}
// filters the array leaving only the prime numbers and sums all prime numbers
let result = prime
.filter(function (a){
if(a === 2 ||a === 3 || a === 5 || a === 7){
return a
} else {
return a % 2 > 0 && a % 3 > 0 && a % 5 > 0 && a % 7 > 0
}}).reduce((a,b) => a+b)
console.log(result)
return result
}
sumPrimes(977); //outputs 108789 instead of 73156
函数sumPrimes(num){
//使用给定num的数字填充数组
设素数=[],i=2;
while(prime.indexOf(num)<0){
主推(一)
i++;
}
//过滤只留下素数的数组,并对所有素数求和
设结果=素数
.过滤器(功能(a){
如果(a==2 | | a==3 | | a==5 | | a==7){
归还
}否则{
返回%2>0&&a%3>0&&a%5>0&&a%7>0
}}).减少((a,b)=>a+b)
console.log(结果)
返回结果
}
素数(977)//输出108789而不是73156
我的filter函数检查一个可以同时被2,3,5,7整除的给定数是否返回一个大于零的余数,如果这个数是素数的话。但是,当提供的参数为977时,它会分解并输出错误的和。有人知道这里发生了什么吗?根据我的评论:你的素数检查有问题。仅仅因为一个数字不能被2、3、5或7除,并不意味着它是素数。您可以简单地从以下答案中回收基本检查逻辑:,并优化您的循环,以便只执行一次迭代 从最小的素数
2
开始for
循环,增加它直到达到目标数。在for循环中,检查数字是否为素数:如果为素数,则将其添加到总和中
这种方法的优点是:
prime
数组中存储任意大的素数数组,这最终会通过求和而减少。当然,这是在你不需要素数的前提下进行的while
循环生成2和目标数之间的所有数字,(2)使用过滤器检查素数,以及(3)使用reduce
方法
//改编自:https://stackoverflow.com/questions/40200089/number-prime-test-in-javascript
函数isPrime(num){
for(设i=2,s=Math.sqrt(num);i=1;
}
函数素数(num){
设和=0;
对于(设n=2;n要检查一个数字是否为素数,它不应被任何其他素数整除。因此,虽然您的逻辑是正确的,但您需要不断扩展素数数组。这可以通过以下方式实现:
const primeArray = (n) => {
var p = [2];
if (n<2) return [];
if (n===2) return [2];
for (let i=3;i<=n;i+=2) if (p.every(x=>i%x)) p.push(i);
return p;
}
const primerarray=(n)=>{
var p=[2];
如果(n这里是另一个可扩展的极简版和性能优化版的Erastostenes筛,其测试上限仅为当前数字的平方根:
函数primerar(n){
对于(var primes=[],i=1,j=0,cap=2;++i2&&i==cap)cap=primes[j]*primes[j++];
if(primes.slice(0,j-1).every(p=>i%p))primes.push(i)
}
返回素数;
}
设pa=primarr(977);
log(“总和:,pa.reduce((a,c)=>a+=c));
log(“所有素数:”,pa.join(“”));
11^2=121既不是素数,也不能被2、3、5或7整除。仅仅因为一个数字不能被2、3、5和7整除并不意味着它是素数。你需要使用不同的逻辑来检查它,就像这样:我希望得到建议,而不仅仅是批评,因为这是我第一次尝试这样的事情。你的问题是“有人能猜出这是怎么回事吗?”评论“11^2=121既不是素数,也不能被2、3、5或7整除。”是对你问题的一个非常具体的回答。我看不到任何批评。谢谢你,特里,我不明白为什么我们在这里检查num的sqrt:s=Math.sqrt(num);i@FrankImade您不需要一直检查到实际数字,因为质数的定义是它不是整数的倍数。最大可能的倍数是通过对数字进行平方运算来实现的,因此您只需要检查到平方根。有关更深入的解释,请参阅原始答案。