ので、私はJavascriptにWikipediaからこの擬似コードを変換しようとしていた。エラトステネスの篩はJavascriptで?
Input: an integer n > 1
Let A be an array of Boolean values, indexed by integers 2 to n,
initially all set to true.
for i = 2, 3, 4, ..., not exceeding √n:
if A[i] is true:
for j = i^2, i^2+i, i^2+2i, i^2+3i, ..., not exceeding n :
A[j] := false
Output: all i such that A[i] is true.
そして、これは限り私が得たようである:
function getPrimes(num) {
var a = [];
for (i=2;i<=num;i++){a.push(true);}
for (i=2;i<=Math.sqrt(num);i++){
for (var j=i*i, coef=0, l=i;j<num-2;coef++){
j = i*i+coef*l-2;
a[j]=false;
}
for (i=0;i<a.length;i++){
if (a[i]){a.splice(i,1,i+2);}
}
}
return a;
}
getPrimes(10); // returns [2, 3, false, 5, false, 7, false, 9, false]
// 9 should be false
あなたが見ることができるように、アルゴリズムはすべてキャッチされていません非素数です。何が私が逃したアイデア?彼らに手を差し伸べたい人には、事前に感謝します。
あなたは、「i」は、内側のループでインクリメントしているので、外側のループ:
考慮にこのすべてを取る、プラスいくつかの他の最適化、私はこのES6コードをお勧めします2回目の内部ループが終了すると、iはsqrt(10)より大きい9になります。 – Jecoms
各反復で 'Math.sqrt(num) 'を再計算しないでください。これは高価な操作です。 – Oriol