- ベストアンサー
Cプログラミング
素数を判定するプログラミングの作成で以下のプログラミングを作成したのですが、すべて 素数でないとでてしまいます。どなたか間違いをおしえていただけませんでしょうか。 #include<stdio.h> int main(void) { int num,i; printf("Please input a number:"); scanf("%d",&num); for (i=2; i < num ; i++){num % i; if (num % i == 0) break; } if (num % i == 0) printf("%d is not prime. \n" ,num); else printf("%d is prime. \n" ,num); return 0; }
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず…… >for (i=2; i < num ; i++){num % i; if (num % i == 0) break; } がナニをやっているのか…解説できますか? 意味のない文が混じっていたりしますけど。 あとは…#1さんが書かれている様に、素数だった場合にiの値がいくつになるか、 1ステップずつ追ってみるとよいかと。 デバッガのステップ実行で、「ソースの記述1行単位」でステップ実行する場合がありますので、 for (i=2; i < num ; i++){ num % i; if (num % i == 0) break; } というように編集してからやってみると良いでしょう。 # iの値に注意しながら…。
その他の回答 (6)
ANo.2への補足に対してお答えします. >ということは・・・とすれば、よいということですよね? 実行してみられたらどうでしょう. ついでですが,テスト段階では重要な変数の値を適当に出力するとデバッグしやすいと思います.
- Tacosan
- ベストアンサー率23% (3656/15482)
いくら C とはいえ 「for文の中での条件でbreakされた後のiの値は保障されません」 などというアホな仕様にはなってません>#3. break は「何も考えずループを脱出する」だけなので....
- kb-nike
- ベストアンサー率36% (72/200)
難しく考えずに、単純に以下コードではいかが? #include <stdio.h> int main( int argc, char *argv[] ) { int num,i; printf("Please input a number:"); scanf("%d",&num); for(i=2; i<num; i++){ if(num % i == 0){ printf("%d is not prime. \n", num); return 0; } } printf("%d is prime. \n" ,num); return 0; }
- shincha119
- ベストアンサー率42% (95/226)
iの値が初期化されてないからじゃないかと。 for(i=2; i < num; i++) のiはfor文の中での条件でbreakされた後のiの値は保障されませんので、forの後で判断するならこんな感じに直せばいいと思います。 int num,i; int j = -1; // ←追加 printf("Please input a number:"); scanf("%d",&num); for (i=2; i < num ; i++){ num % i; if (num % i == 0) // 条件に合ったらjを0にする j=0; break; } //if (num % i == 0) printf("%d is not prime. \n" ,num); if (j == -1) printf("%d is not prime. \n" ,num); // ←変更 else printf("%d is prime. \n" ,num); return 0; } booleanを使って条件があったらtrueにするとか、そういう方法ももちろんありです。
久しぶりの C なので自信はありませんが・・・. num に素数を入力した場合, for のループから出た段階で i の値が num になっていませんか? もしそうなら,ループの次の if で条件が満たされてしまいます. 違っていたら,すみません.
- Tacosan
- ベストアンサー率23% (3656/15482)
num が素数のときの動作をじっと調べてください.
補足
ということは #include<stdio.h> int main(void) { int num,i; printf("Please input a number:"); scanf("%d",&num); for (i=2; i < num ; i++){num % i; if (num % i == 0) break; } if (num == i) printf("%d is prime. \n" ,num); else printf("%d is not prime. \n" ,num); return 0; } とすれば、よいということですよね?