みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;
}

投稿日時 - 2011-11-18 16:34:31

QNo.7140399

すぐに回答ほしいです

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

とりあえず……
>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の値に注意しながら…。

投稿日時 - 2011-11-18 23:18:45

ANo.6

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.2への補足に対してお答えします.

>ということは・・・とすれば、よいということですよね?

実行してみられたらどうでしょう.

ついでですが,テスト段階では重要な変数の値を適当に出力するとデバッグしやすいと思います.

投稿日時 - 2011-11-19 14:15:58

ANo.5

いくら C とはいえ
「for文の中での条件でbreakされた後のiの値は保障されません」
などというアホな仕様にはなってません>#3.

break は「何も考えずループを脱出する」だけなので....

投稿日時 - 2011-11-18 23:17:57

ANo.4

難しく考えずに、単純に以下コードではいかが?

#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;
}

投稿日時 - 2011-11-18 18:06:22

ANo.3

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にするとか、そういう方法ももちろんありです。

投稿日時 - 2011-11-18 17:56:25

久しぶりの C なので自信はありませんが・・・.

num に素数を入力した場合,
for のループから出た段階で
i の値が num になっていませんか?
もしそうなら,ループの次の if で条件が満たされてしまいます.

違っていたら,すみません.

投稿日時 - 2011-11-18 17:01:09

補足

ということは
#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;
}
とすれば、よいということですよね?

投稿日時 - 2011-11-18 17:20:27

ANo.1

num が素数のときの動作をじっと調べてください.

投稿日時 - 2011-11-18 16:58:38

あなたにオススメの質問