//エラトステネスのふるい改良版
#include <stdio.h>
#define MAX 1000
int main()
{
int i,j;
//エラトステネスのふるい用配列。
//true なら素数。
//偶数は明らかに素数でないので最初から排除。
//2も素数として排除。
//(MAX+1)個の配列で3〜(2*MAX+3) までの素数に対応
bool Prime[MAX+1];
for(i=0;i<=MAX;i++){//初期化
Prime[i] = true;
}
int k;//添え字
int prm;//添え字に対応する素数
//添え字k <-> 素数prm の変換式は
//(2*k+3) <-> prm
for(i=0; i<=MAX; i++){//i=0からi=MAXまで
if(Prime[i] == true){
prm = 2*i+3;//添え字iに対応する素数
for(k=i+prm; k<=MAX; k+=prm){
//エラトステネスの超重要ポイント
//for(j=prm*3,k=(j-3)/2;k<=MAX;j+=2*prm,k=(j-3)/2)と同じ
//倍数(j+2*prm)を除いていく。偶数はすっ飛ばしてる事に注意。
Prime[k] = false;//倍数は素数から除外
}
}
}
//合ってるかどうか表示
printf("%d ",2);//2は無条件で素数としたため。
for(i=0;i<=MAX;i++){
if(Prime[i]){
printf("%d ",2*i+3);
}
}
return 0;
}