我正在研究一个旨在生成素数的程序,而我正试图找到第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)
我知道我可以复制并粘贴所有素数,但我想让程序正常工作。任何使程序停止冻结的想法?
答案 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;
};
你显然可以让它看起来更漂亮,但我只是很快就做到了,所以你可以明白这一点。我希望这有帮助!如果您还有其他问题,请与我们联系。