- ベストアンサー
素数を判定するプログラム
整数をひとつ入力して、それが素数かどうかを判定するプログラムを作ったのですが、素数でないものを入力しても「素数です」といわれます。 どうも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; } どうかよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#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; }
その他の回答 (4)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
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; }
お礼
ご丁寧にありがとうございます。 return 0を使うとそこでプログラムを終われるんですね。初めて知りました。 本当にありがとうございました。
- ttyp03
- ベストアンサー率28% (277/960)
for文の2番目のパラメータは「ループ条件」です。 つまりここに設定した条件が成立している間ループを続けます。 現状の n == number - 1 では、しょっぱなから条件が成立しないのでループせずに抜けてしまいます。 従ってこの場合は n < number または n <= number - 1 のように指定する必要がありますね。
お礼
なるほど、終了する条件と勘違いしてました。 ありがとうございます。
- asahina02
- ベストアンサー率47% (95/202)
for (; n == number - 1; n++) { が間違ってるような・・・ for (; n <= number - 1; n++) { ではないでしょうか? for構文の 真ん中部分は その条件式が真の場合にループ継続なので、現状だといきなり「偽」になっちゃいますよね。
お礼
ループ条件がいまいち理解できていませんでした。 でもこれではっきりしました! ありがとうございます。
- Chronos198
- ベストアンサー率30% (105/349)
for (; n == number - 1; n++) { このfor()の処理としては、 for()に入ってきた時のnの値とnumberの値を比較して、 nがnumberより1小さい数字である間、繰り返し処理が行われる。 となります。 素数でない値、例えば 4 が入力された場合、どうなるでしょう?処理は行われるでしょうか? そのfor()は、どういう条件で繰り返し処理が行われれば良いのか、 それを考えてみてください。
お礼
ループ条件を理解できてませんでした。 これではずっと偽になってしまいますね。 ありがとうございます。
お礼
ご丁寧にありがとうございます。 return 0を使うとそこでプログラムを終われるんですね。初めて知りました。 本当にありがとうございました。