Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的算法在这个数字上失败了?_Javascript_Typescript_Algorithm - Fatal编程技术网

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
    数组中存储任意大的素数数组,这最终会通过求和而减少。当然,这是在你不需要素数的前提下进行的
  • 与旧代码相比,您不需要执行多次迭代,在旧代码中执行重复迭代:(1)使用
    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您不需要一直检查到实际数字,因为质数的定义是它不是整数的倍数。最大可能的倍数是通过对数字进行平方运算来实现的,因此您只需要检查到平方根。有关更深入的解释,请参阅原始答案。