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

回答編集履歴

1

エラストネスの篩を使った実装例を追記

2020/07/15 01:30

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -13,4 +13,23 @@
13
13
  for(i=n;i>1;i--){
14
14
  ```
15
15
 
16
- というループにして、`i`が素数か調べて、素数なら表示して処理を終了すればいいのでは?
16
+ というループにして、`i`が素数か調べて、素数なら表示して処理を終了すればいいのでは?
17
+
18
+ 追記: エラストネスの篩を使った実装例を示しておきます。
19
+
20
+ ```c
21
+ #include <stdio.h>
22
+
23
+ int main(void) {
24
+ int n;
25
+ scanf("%d", &n);
26
+ printf("入力値:%d\n", n);
27
+
28
+ int primes[n + 1];
29
+ for (int i = 0; i <= n; i++) primes[i] = (i > 3 && i % 2 == 0) ? 0 : i;
30
+ for (int i = 2; i*i <= n; i++) if (primes[i] != 0) for (int x = i + i; x <= n; x += i) primes[x] = 0;
31
+ while (n > 0 && primes[n] == 0) n--;
32
+ printf("%d", n);
33
+ return 0;
34
+ }
35
+ ```