プロが教えるわが家の防犯対策術!

整数をひとつ入力して、それが素数かどうかを判定するプログラムを作ったのですが、素数でないものを入力しても「素数です」といわれます。
どうも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;

}

どうかよろしくお願いします。

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/05/24 13:35

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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/05/24 13:36

for文の2番目のパラメータは「ループ条件」です。


つまりここに設定した条件が成立している間ループを続けます。
現状の n == number - 1 では、しょっぱなから条件が成立しないのでループせずに抜けてしまいます。
従ってこの場合は n < number または n <= number - 1 のように指定する必要がありますね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/05/24 13:38

for (; n == number - 1; n++) {


が間違ってるような・・・

for (; n <= number - 1; n++) {
ではないでしょうか?

for構文の 真ん中部分は その条件式が真の場合にループ継続なので、現状だといきなり「偽」になっちゃいますよね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/05/24 13:39

for (; n == number - 1; n++) {



このfor()の処理としては、
 for()に入ってきた時のnの値とnumberの値を比較して、
 nがnumberより1小さい数字である間、繰り返し処理が行われる。
となります。

素数でない値、例えば 4 が入力された場合、どうなるでしょう?処理は行われるでしょうか?

そのfor()は、どういう条件で繰り返し処理が行われれば良いのか、
それを考えてみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/05/24 13:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!