Problem 7 「10001番目の素数」 †

素数を小さい方から6つ並べると 2, 3, 5, 7, 11, 13 であり, 6番目の素数は 13 である.
10001 番目の素数を求めよ.

解法
http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9
Wikiにあるエラトステネスの篩を使います。
エラトステネスの篩とは素数リストを得るための効率的な方法です。
素数の判定は非常に奥が深く難しい理論がたくさんありますが。
一般向けではこの篩と試し割がわかれば大体大丈夫です。
言語によっては素数判定メソッドが使えるものもありますのでそれを使うのも手です。


篩の具体的な実装については
http://blog.livedoor.jp/add20/archives/1059267.html
を参考にしてください。
リンク先のprimeをそのまま使用します。

自然数1~nまでの間に素数は大体n*1/10個ありますので。
安全マージンを取って20万個の配列を用意します。

そして配列に対してエラトステネスの篩を適用します。
あとはi=2から初めて
prime[i]=1なら素数が一個あったとカウントしていき。
10001番目の素数が見つかったらその数を答えとします。
篩適用後のコードのイメージは以下の通りとなります。

int count=0;
int i;
for(i=2;i<200000;i++){
     if(prime[i]==1)count++;
     if(count==10001)break;
}
printf("ans=%d",i);

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2014年01月09日 16:17