teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

ソース追記

2020/06/07 13:01

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -5,4 +5,25 @@
5
5
 
6
6
  *** prime count: 21787 ***
7
7
 
8
- ≒5/10000秒です。
8
+ ≒5/10000秒です。
9
+ GitHubに上げている『エラトステネスの篩』です。
10
+ 最初に見つかった非0を残してその倍数を(0で)消去しています。
11
+ 最後には穴だらけの配列に成りますが・・・
12
+ ```c
13
+ /*
14
+ * エラトステネスの篩本体 O(n log log n)
15
+ */
16
+ void SieveOfEratosthenes(long arry[], long siz)
17
+ {
18
+ long lim = (long)(ceil(sqrt(siz+2))); // 最大値の平方根+αまで調べればいい
19
+ for (long i = 2; i < lim; i++) {
20
+ if (arry[i]) {
21
+ long tmp = arry[i]; // 素数を取り出す
22
+ for (long j = i + i; j < siz; j += tmp) {
23
+ arry[j] = 0; // 素数の倍数をクリア
24
+ }
25
+ }
26
+ }
27
+ }
28
+ ```
29
+ 最後に別の配列を用意して、非0だけを抽出すれば、素数の表が作れます。