Javascript 大范围输入的素数之和

Javascript 大范围输入的素数之和,javascript,loops,Javascript,Loops,我正在编写代码以查找给定数字以下所有素数的总和(在本例中,我希望查找2000000的素数) 对于20000或更低的数字,我的代码可以正常运行,但当我向代码中添加0时,它就不会运行了 我试着在codesandbox上运行它,它会告诉我某处有一个潜在的无限循环 const isPrime = number => { let k=0 for (let i=2; i < number; i++) { if (number % i === 0) { k++

我正在编写代码以查找给定数字以下所有素数的总和(在本例中,我希望查找2000000的素数)

对于20000或更低的数字,我的代码可以正常运行,但当我向代码中添加0时,它就不会运行了

我试着在codesandbox上运行它,它会告诉我某处有一个潜在的无限循环

const isPrime = number => {

  let k=0

  for (let i=2; i < number; i++) {
    if (number % i === 0) {
    k++
    }
  }
  if (k === 0) {
    return true
  } else {
      return false
  } 
}

const sumOfPrimes = limit => {

  let primeSum = 0
  for (let i=1; i <= limit; i++) {
    if (isPrime(i)) {
        primeSum += i
    }
  } console.log(primeSum);
}

sumOfPrimes(2000000);
const isPrime=number=>{
设k=0
for(设i=2;i{
设素数和=0

对于(假设i=1;i如果你必须处理200万这样大的数字,那么这不是解决问题的正确方法。有很多算法可以确定一个数字是否为素数,并且在算法的复杂度和大数字的效率之间存在折衷。为了知道什么算法适合你的使用e、 我们需要知道您的用例是什么。(听起来您试图解决课程或代码挑战中的给定问题。)

但是,即使您使用的是算法,也有一些简单的方法来加速它。首先,在
isPrime
的循环中,当
number%i==0
时,您应该
返回false
,而不是增加一个变量,然后再检查它。这一更改本身应该大大加快您的程序,因为大多数除数的除数很小,所以大多数数字只会循环几次


另一个简单的加速方法是限制你循环的数字。你正在迭代从2到n的所有数字。但是要检查一个数字是否是素数,你只需要检查它是否被素数整除。如果你的目标是计算前几个素数的和,那么这很简单:建立一个素数列表,检查每个n与列表中已有的数字进行对比。我强烈怀疑这种方法将足够快满足您的需要。

更有效的方法是使用埃拉托斯烯筛。通常,这将返回一个高达给定限制的素数列表,但通过
reduce
的小调整,您可以使其返回总和:

函数sumOfPrimes(n){
常量nums=数组(n).fill(真);
nums[0]=nums[1]=false;
常数sq=数学sqrt(n);
对于(设i=2;i和+(a&&i),0);
}
console.log(sumOfPrimes(10));
log(sumOfPrimes(2000000));
我只是想用一个示例实现进行备份:

常量素数=[2,3]; 函数isPrime(n){ //消除基本情况 如果(n<2)返回false; 常量sqrt=Math.sqrt(n); 让我; //检查已知素数是否为n的因子 对于(素数的i){ 如果(i>sqrt)中断; 如果(n%i==0)返回false; } //检查最大值之间是否存在奇数 //已知素数和sqrt(n)是n的因子
对于(i+=2;i“势无限循环”这并不意味着你有一个无限循环,它只是意味着它运行得很长。这是意料之中的,你的算法有平方时间复杂性。不,它不会消耗内存-事实上,你应该使用更多的内存,并用它换取更好的运行时间。你可以做一些事情来加速它。首先,你应该提前退出for循环。一旦你发现它不是素数,只要返回
if(number%i==0)return false
。此外,你只需要检查一个数字的平方根。它仍然要慢2000000。你的
isPrime
非常次优。两个简单的改进是只迭代
Math.sqrt(number)
,并从
for
循环中返回false
,返回第一个遇到的因子,而不是计算所有因子。如果它只有一个因子,您已经知道它不是质数。有趣的是,我最近提供了。我知道它不在这个特定问题的范围内,但该链接可能会帮助任何人谁会遇到这个答案,并在较大的输入中出现内存不足异常(尽管由于您使用的是
布尔值
,我不确定内存使用情况如何比较)