「エラトステネスのふるい(素数判定)」の編集履歴(バックアップ)一覧に戻る
エラトステネスのふるい(素数判定) - (2010/06/12 (土) 18:30:37) の編集履歴(バックアップ)
エラトステネスのふるい(素数判定)
素数表を生成するアルゴリズムにエラトステネスのふるいというものがあります。
まずはこのアルゴリズムなしで素数かどうか調べる方法を考えてみます。
ある数が素数かどうか調べるにはその数がその数より小さい数すべて(1以外)で
割り切れない場合素数なのでfor文で回せば簡単にコーディングできそうです。
まずはこのアルゴリズムなしで素数かどうか調べる方法を考えてみます。
ある数が素数かどうか調べるにはその数がその数より小さい数すべて(1以外)で
割り切れない場合素数なのでfor文で回せば簡単にコーディングできそうです。
+ | プログラム例 |
/*1000000までの素数をすべて出力するプログラム*/ #include<stdio.h> #include<math.h> // 過去問に合わせています。 #define MAX 1000000 int main(void){ //char型にすることでbyte幅が1byteで済む char p[MAX+1]; int i,j; // 0,1は素数でないので0を代入する p[0]=0; p[1]=0; for(i=2; i<=MAX; i++)p[i]=1; // +1の理由: // めったにないが、環境によってsqrt(4)=1.99...になり、 // iがint型なので小数点以下が切り捨てられしまうため。 for(i=2; i<=sqrt(MAX)+1; i++) if(p[i]==1) // 倍数を消していきます(素数でないものに0を入れる)。 for(j=i*2; j<=MAX; j=j+i)p[j]=0; // Output for(i=0; i<=MAX; i++) // 配列の中身が1だと素数です。 if(p[i]==1) printf("%d ",i); puts(""); }
...