回答編集履歴

1

ソース追記

2020/06/07 13:01

投稿

cateye
cateye

スコア6851

test CHANGED
@@ -13,3 +13,45 @@
13
13
 
14
14
 
15
15
  ≒5/10000秒です。
16
+
17
+ GitHubに上げている『エラトステネスの篩』です。
18
+
19
+ 最初に見つかった非0を残してその倍数を(0で)消去しています。
20
+
21
+ 最後には穴だらけの配列に成りますが・・・
22
+
23
+ ```c
24
+
25
+ /*
26
+
27
+ * エラトステネスの篩本体 O(n log log n)
28
+
29
+ */
30
+
31
+ void SieveOfEratosthenes(long arry[], long siz)
32
+
33
+ {
34
+
35
+ long lim = (long)(ceil(sqrt(siz+2))); // 最大値の平方根+αまで調べればいい
36
+
37
+ for (long i = 2; i < lim; i++) {
38
+
39
+ if (arry[i]) {
40
+
41
+ long tmp = arry[i]; // 素数を取り出す
42
+
43
+ for (long j = i + i; j < siz; j += tmp) {
44
+
45
+ arry[j] = 0; // 素数の倍数をクリア
46
+
47
+ }
48
+
49
+ }
50
+
51
+ }
52
+
53
+ }
54
+
55
+ ```
56
+
57
+ 最後に別の配列を用意して、非0だけを抽出すれば、素数の表が作れます。