大量循环需要太长时间才能加载

时间:2015-04-08 19:05:31

标签: javascript for-loop primes

我正在研究一个旨在生成素数的程序,而我正试图找到第10001个素数。每次循环运行时,它都会测试变量i,看它是否可被变量j整除,变量j是另一个循环的一部分,变量达到i的一半。如果i可以被j整除,那么它将一个加到变量prime,当循环完成时,它检查变量prime是否大于2;如果是,那么我不是素数。如果它是素数,则将push()编辑到变量数组,该数组存储所有素数。对不起,如果这有点令人困惑。

我的问题是虽然这段代码有效,但每当我将第一个for循环设置得太高时(这里我以100000结尾),我的浏览器会冻结:

var prime = 0;
var array = [];
for(var i = 2; i <= 100000; i+=1) {
  var prime = 0;
  for(var j = 0; j <= i/2; j+=1) {
    if(i % j === 0) {
      prime += 1;
    }
  }

  if(prime < 2) {
    array.push(i);
  }
}

console.log(array.length)

我知道我可以复制并粘贴所有素数,但我想让程序正常工作。任何使程序停止冻结的想法?

1 个答案:

答案 0 :(得分:-1)

这是因为算法的时间复杂度几乎为O(n ^ 2)。 Sieve of Eratosthenes创建了一个更好的算法,可以防止浏览器冻结。 这是一种方法:

var exceptions = {
  2: 2,
  3: 3,
  5: 5,
  7: 7
}

var primeSieve = function (start, end) {
  var result = [];
  for (start; start < end; start++) {
    if (start in exceptions) result.push(start);
    if (start > 1 && start % 2 !== 0 && start % 3 !== 0 && start % 5 !== 0 && start % 7 !== 0) {
      result.push(start);
    }
  }
  return result;
};

你显然可以让它看起来更漂亮,但我只是很快就做到了,所以你可以明白这一点。我希望这有帮助!如果您还有其他问题,请与我们联系。