1

次のコードは、ユーザーが入力した数値が素数かどうかを示す出力を示しています。

#include <stdio.h>
#include <stdlib.h>

int a,b;
int main(void) {

 printf("Enter number: ");
 fflush(stdout);
 scanf("%d",&a);

 for (b = 2; b < a; b++)
 {
   if (a % b == 0)
    break;
 }

 if (b<a)
 {
   printf ("%d is divisible by %d\n", a, b);
 }

 else
 {
   printf ("%d is prime \n", a);
 }
return 0;
}

上記のコードは私のものではなく、毎回素数を正しく識別します (つまり、 else句のprintfステートメントが出力されます)。

ifステートメントについての私の理解では、if-elseステートメントのelse句は、 else句がまだない最も近いifステートメントに属します。そうは言っても、上記のコードのelse節は最も近いifステートメントに属していると思います。

私の質問は次のとおりです。ユーザーが 31 や 37 などの素数を入力した場合、 else句のprintfステートメントはどのように出力されるのでしょうか? (2 番目のifステートメントの) 条件は、b が だけインクリメントされることを考慮すると、常に true になります。したがって、ユーザーが数値 31 を入力すると、変数bは 30 にインクリメントされるだけです。ユーザーが入力した数値が素数であるかどうかに関係なく、2 番目のifステートメントのprintfステートメントが出力されることはありません。条件が常に真になることを考えると、そうではないでしょうか?if (b<a)(a-1)if (b<a)

上記のコードはどのようにしてすべての素数を正しく出力し、それで問題なく動作するのでしょうか? ( if文の仕組みについての私の限られた理解によれば、そうすべきではありません)

4

3 に答える 3

4

if (b<a)(2 番目の if ステートメントの)条件は、b が だけインクリメントされることを考慮すると、常に true になります(a-1)

そうではありません。除数が見つからない場合、条件b<aが false になるまで for ループが続行されます。これは、b == aではなく の場合に発生しb == a-1ます。ループ条件が false の場合、ループ本体は実行されませんが、インクリメントは発生しています。

于 2016-01-09T10:53:33.553 に答える
2

このループ

for (b = 2; b < a; b++)
{
  if (a % b == 0)
   break;
}

2 つの場合に中断できます。1 つ目は、aが で割り切れる場合です。b

  if (a % b == 0)
   break;

しかし、素数の場合、この条件は常に false になります。

したがって、ループが中断されるもう 1 つのケースは、bインクリメントの後です。

for (b = 2; b < a; b++)
                   ^^^

と等しくなりaます。この場合の条件は

for (b = 2; b < a; b++)
            ^^^^^

false に等しくなり、制御が if-else ステートメントに渡されます。もしそうなら、bは に等しくaaは素数です。

于 2016-01-09T11:04:57.680 に答える
1

まず、あなたは正しいです、間の空白

if (b<a)
{
    ...
}

else
{
    ...
}

関係ない。はelse確かに に属しifます。

第二に、if (b<a)が常に真であるとは限りません。true が返されない限り、条件が満たされないa % b == 0までループが続きb==aます。彼らはまた書くことができたif (b!=a).

于 2016-01-09T10:55:45.527 に答える