メインコンテンツまでスキップ

【オリジナル】エラトステネスのふるい

問題文はすべてelato.htmlに書いてあります。

答えは下に書いてあります。では頑張って!

ファイル elato.html をダウンロード
解答

この問題は、使いまわし関数がないと大変難しいです

function isPrime(num) {
//1 は素数でないので false を返す
if(num == 1) {
return false;
//2 は素数なので true を返す
} else if(num == 2) {
return true;
} else {
for(i = 2; i < num; i++) {
//割り切れたら合成数なのでfalse
if(num % i == 0) {
return false;
}
//割り切れないとき素数なのでtrue
if(i + 1 == num) {
return true;
}
}
}
}

function main() {
let maxI = read();
let sosu = [];
let block = [];

// 1 から 最高の数 まで 1 ずつ増えるループ
for (let i = 1; i <= maxI; i++) {
// i が 1 でない かつ i が除外済みではない(= i が配列 block に含まれていない)なら
if (i != 1 && !block.includes(i)) {

// 先程定義した isPrime 関数を呼び出し、 i が素数なら実行する操作
if (isPrime(i)) {

// 配列操作関数 push で、配列 sosu の末尾に i の値を追加
sosu.push(i);

// 素数 i の倍数をすべて除く操作
for (let j = i; j <= maxI; j++) {
if (j != i && j % i == 0) {
// 配列操作関数 push で、配列 block の末尾に j の値を追加
block.push(j);
}
}

}
}
}

// 使いまわし関数を使用して配列を一気に出力
printArray(sosu);

// 配列のプロパティ length で、配列の個数を取得
println('素数は合計' + sosu.length + '個');
}