実現したいこと
ソースコードのcalc関数のなかでどの行で何を行っているのかの説明
前提
c言語で書きました。
入力したn未満の素数をすべて出力するプログラム
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
c
1#include <stdio.h> 2#define MAX 1000 3#define _CRT_SECURE_NO_WARNINGS 4 5//--------------------- 6int input(int *n) { 7 scanf_s("%d\n", n); 8 return 0; 9} // end of input 10//--------------------- 11int calc(int prime_nums[], int n) { 12 int i; 13 int j; 14 15 // 「エラトステネスのふるい」による処理が終了した後,prime_numsは以下のようになる. 16 // prime_nums[i] = 0; iが素数でないとき 17 // prime_nums[i] = 1; iが素数のとき 18 19 //?? prime_numsに適切な値を設定 20 for (i = 2; i < n; i++) { 21 prime_nums[i] = 1; 22 } 23 for (i = 2; i < n; i++) { 24 if (prime_nums[i] == 1) { 25 for (j = 2 * i; j < n; j++) { 26 if (j%i == 0) { 27 prime_nums[j] = 0; 28 } 29 } 30 } 31 } 32 return 0; 33} // end of calc 34//--------------------- 35int output(int prime_nums[], int n) { 36 int i; 37 38 //?? prime_nums[i] = 1 となるiを出力する ( i<n ). 39 for (i = 2; i < n; i++) { 40 if (prime_nums[i] == 1) { 41 printf("%d\n", i); 42 } 43 } 44 // iを出力する書式は,”%d\n"とする. 45 return 0; 46} // end of output 47 48//--------------------- 49int main() { 50 int prime_nums[MAX]; 51 int n; 52 int cc; 53 54 cc = input(&n); // 求める素数の最大値を入力する nは,課題のNに相当 55 56 cc = calc(prime_nums, n); // 素数を求める. 57 58 cc = output(prime_nums, n); // 求めた素数を出力する 59 60 return 0; 61} // end main 62 63 64 65
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
しつもんはなんですか
calc関数のforループの中で、iの2倍をiで割った値が0になるかどうかの部分がなにをしているのかがわかりません。
質問タイトルが「エラトステネスの篩の説明」となっていますが、エラトステネスの篩を知らない人に対して、エラトステネスの篩のやり方を日本語でも説明をしたいと言うことでしょうか?
プログラムとしては改善ポイント多数である物の、期待通り動きそうなので、
「実現したいこと」をもうすこしブレークダウンして書くと良いと思います。
同時刻でコメントが入れ違いになってしまいました。
> iの2倍をiで割った値が0になるかどうかの部分がなにをしているのかがわかりません。
ということですが、エラトステネスの篩をどのような方法だと理解していますか?
このコードはご自分で書いた物ではないと言うことなのでしょうか?
返信ありがとうございます。
そうです。ほかの部分は何をしているのかはわかるのですが、素数かどうかの判別をどうやって行っているのかがわかりません。
>c言語で書きました。
komkomさんが書いたのですから
そのときの設計書なり、使用したアルゴリズムの資料なりを確認すれば
いいのではないでしょうか。
18:37のコメントは、タイミング的に私の18:34のコメントへの回答かと思ったのですが、
・エラトステネスの篩をどのような方法だと理解していますか?
・このコードはご自分で書いた物ではないと言うことなのでしょうか?
について何も書かれてないのですが、18:30のコメントへの返信ですかね?
18:30のコメントは質問意図を誤解していたので無視して下さい。
(「自分ではプログラムは理解できている(=自分で書いたのだから当然)が、コメントでどう書けばいいかについて教えて欲しい」という質問かと思っていました)
> 素数かどうかの判別をどうやって行っているのか
素数を選んでいるのではなく、合成数を除外しています。
つまり、pが素数なら 2p, 3p, ... np は合成数なので、それを除外します。
割り算(剰余)せずに素数を探すのが「エラトステネスの篩」のいいとこなんだから、
if (j%i == 0) {
prime_nums[j] = 0;
}
コレ↑やっちゃダメな気がする...
言われている 25-6 行目の
>for (j = 2 * i; j < n; j++) {
>if (j%i == 0) {
は… wiki を見るだけでも違うのが分かると思います。
https://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
だからこその質問かもしれませんが、それなら 1T2R3M4 さんが既に指摘されてます通り、このコードの元ネタを深堀するとか提示頂くとかが必要でしょう。
回答1件
あなたの回答
tips
プレビュー