• ベストアンサー

2から120以下の素数を求める

2以上120以下の素数を全て求めて表示するプログラムを書きなさい。 素数か否かの判定には以下のアルゴリズム[処理手順] (2 <= n <= 120のときのみ有効)を用いなさい。 i) nが2, 3, 5, 7, 11のうちのどれかと等しければNは素数 ii) nが2, 3, 5, 7, 11の全てに対して割切れなければNは素数 iii) それ以外(iもiiも不成立)のとき、Nは素数ではない。 *) 2, 3, 5, 7, 11は最初に出力してしまい、 n=12から120までをfor文のなかで判定すればよい。 というC言語の課題です。 自分でプログラムを作ったのですが、うまくできません・・。 if文が働いてないようなのですが、どこが間違っているのでしょうか? #include <stdio.h> int main(void) { int i; printf("2\n"); printf("3\n"); printf("5\n"); printf("7\n"); printf("11\n"); for (i=12;i<=120;i++){ if (i%2!=0 || i%3!=0 || i%5!=0 || i%7!=0 || i%11!=0){ printf("%d\n",i); } else{ printf(""); } } printf( "\n" ); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ii) nが2, 3, 5, 7, 11の『全て』に対して割切れなければNは素数 ですから ifの条件設定がおかしいですよ たとえば 12の場合 ( 12 % 2 ) != 0 ... FALSE ( 12 % 3 ) != 0 ... FALSE ( 12 % 5 ) != 0 ... TRUE ( 12 % 7 ) != 0 ... TRUE ( 12 % 11 ) != 0 ... TRUE ということは 12は 2と3の倍数ということになります したがって『素数ではない』と判断出来ます ||演算子でこの判断が可能なのでしょうか 蛇足 12は 2と3の倍数である事は明らかなので 13から検査すればいい ループカウントアップを1にするより 2としてやれば偶数のチェックはしなくて済む ループの終了条件も n<=120 120は当然偶数なので2の倍数であるから 『<=』の『=』は不要かも

kittypink7
質問者

お礼

ifの条件設定が変だったんですね・・ ありがとうございます!解決しました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

(へ) 理屈的には「偶数は iii) に落ちるので最初から無視した」といえばいいと思います>#2. もっといえば, 120以下の素数を見付けるなら 11 で割切れるかどうかの判定も不要だけど (課題としては) まずいんだろうなぁ.

kittypink7
質問者

お礼

11で割り切れる判定もいらないんですね・・ ただ手順通りにと指定されているので 今回はこのまま提出します。 ありがとうございました!

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

|| ではなく && ですね。 よく条件を考えてください。 まあ、課題が妥当かどうかは別として、課題でしてされているんで、 奇数だけとか、13からとかはルール違反になるんでしょうね。

kittypink7
質問者

お礼

&&でやってみたところ、うまくできました! ありがとうございます! 一応課題の通り12からにして提出します。