var fs = require('fs');
var outfile = "primes.txt";
function getPrimes(max) {
var primeSieve = [], i, j, primes = [];
for (i = 2; i <= max; ++i) {
if (!primeSieve[i]) {
// i has not been marked - it is prime
primes.push(i);
for (j = i << 1; j <= max; j += i) {
primeSieve[j] = true;
}
}
}
return primes;
}
fs.writeFileSync(outfile, getPrimes(1000).slice(0,100) + ",");
console.log("Script: " + __filename + "\nWrote: " + getPrimes(1000).slice(0,100) + "To: " + outfile);
我有上面的代码,我修改了以产生输出(由其他人提供的主算法)。我是Javascript的新手,并且不确定以下行实际上在做什么以及&lt;&lt;运营商意味着(我一直无法在Javascript网站上找到)。
for (j = i << 1; j <= max; j += i)
我知道它将主要primeSieve数组中的相关数字标记为true,因此它们不会填充primes数组,但是我不知道它是如何做的。
答案 0 :(得分:1)
<<
运算符是left shift operator。左参数(在转换为整数值后,如果需要)向左移动右参数指定的位数,右填充零。向左移动与乘以2相同。
内部循环只在true
的每个元素中存储primeSieve
,该元素的索引是i
的倍数。因此,如果primeSieve[j]
为true
,则j
必须是某些先前i
的倍数(因此j
不能为素数)。相反,如果primeSieve[i]
不是true
,那么它不是i
之前任何值的倍数;因为它包括从2
到i-1
的所有整数,所以i
必须是素数。
为了收集所有素数达到一定的最大值,这种方法远远优于独立测试每个整数的素数的技术。但是,它远非最有效的方法。例如,请注意primeSieve
的元素可能会多次设置为true
。例如,在primeSieve[6]
时设置i==2
,在i==3
时设置i
。此外,一旦max
超过max
的平方根,内循环就会浪费,因为保证在此时标记所有最多{{1}}的复合数字。有关这一切是如何工作的更多信息,请参阅Wikipedia article on the Sieve of Eratosthenes,并指出更有效的方法。
P.S。该代码看起来suspiciously familiar。 : - )