• ベストアンサー

素数を判定するプログラム

整数をひとつ入力して、それが素数かどうかを判定するプログラムを作ったのですが、素数でないものを入力しても「素数です」といわれます。 どうもfor文が評価されていないような気がしますが、原因がわかりません。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n = 2; int i; printf("1より大きい整数を入力してください: "); scanf("%d",&number); while (number <= 1) { printf("1より大きい整数を入力してください: "); scanf("%d",&number); } if (number == 2) { printf("%dは素数です\n",number); goto OUT; } else { for (; n == number - 1; n++) { i = number % n; if (i == 0) printf("%dは素数ではありません\n", number); if (i == 0) goto OUT; } } printf("%dは素数です\n", number); OUT: return 0; } どうかよろしくお願いします。

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

  • ベストアンサー
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.4

#include <stdio.h> int main(void) { int number; int n; int i; printf("1より大きい整数を入力してください: "); scanf("%d", &number); while (number <= 1) { printf("1より大きい整数を入力してください: "); scanf("%d", &number); } if (number == 2) { printf("%dは素数です\n", number); return 0; } else { for (n = 2; n < number; n++) { i = number % n; if (i == 0) { printf("%dは素数ではありません\n", number); return 0; } } } printf("%dは素数です\n", number); return 0; }

cermet
質問者

お礼

ご丁寧にありがとうございます。 return 0を使うとそこでプログラムを終われるんですね。初めて知りました。 本当にありがとうございました。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

for のループは、条件が成立する間なので、 他の人がご指摘の通り n == number - 1 の条件では、ループが継続しませんね。この誤りは私のせいですね。 すみません。<(_ _)> ---------------------------------------------------------------- #include <stdio.h> int main(){ int number=1; int n; while (number <= 1) { printf("1より大きい整数を入力してください: "); scanf("%d",&number); } if (number != 2) { if(0==(number & 1)){//偶数判定 printf("%dは素数ではありません\n", number); return 0; } for (n=3; n*n <= number; n+=2) { if(0 == number % n){ printf("%dは素数ではありません\n", number); return 0; } } } printf("%dは素数です\n", number); return 0; }

cermet
質問者

お礼

ご丁寧にありがとうございます。 return 0を使うとそこでプログラムを終われるんですね。初めて知りました。 本当にありがとうございました。

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.3

for文の2番目のパラメータは「ループ条件」です。 つまりここに設定した条件が成立している間ループを続けます。 現状の n == number - 1 では、しょっぱなから条件が成立しないのでループせずに抜けてしまいます。 従ってこの場合は n < number または n <= number - 1 のように指定する必要がありますね。

cermet
質問者

お礼

なるほど、終了する条件と勘違いしてました。 ありがとうございます。

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.2

for (; n == number - 1; n++) { が間違ってるような・・・ for (; n <= number - 1; n++) { ではないでしょうか? for構文の 真ん中部分は その条件式が真の場合にループ継続なので、現状だといきなり「偽」になっちゃいますよね。

cermet
質問者

お礼

ループ条件がいまいち理解できていませんでした。 でもこれではっきりしました! ありがとうございます。

回答No.1

for (; n == number - 1; n++) { このfor()の処理としては、  for()に入ってきた時のnの値とnumberの値を比較して、  nがnumberより1小さい数字である間、繰り返し処理が行われる。 となります。 素数でない値、例えば 4 が入力された場合、どうなるでしょう?処理は行われるでしょうか? そのfor()は、どういう条件で繰り返し処理が行われれば良いのか、 それを考えてみてください。

cermet
質問者

お礼

ループ条件を理解できてませんでした。 これではずっと偽になってしまいますね。 ありがとうございます。