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子句属于最近的if语句,它还没有else子句。因此,话虽如此,我相信上面这段代码中的else子句属于最近的if语句。

我的问题是:如果用户输入像 31 或 37 这样的素数或任何其他素数,else子句的printf语句如何打印?考虑到 b 只会递增到,条件(第二个if语句的)将始终为真。所以如果用户输入数字 31,变量b只会增加到 30。不应该是打印第二个if语句的printf语句,不管用户输入的数字是否是素数与否,考虑到条件将始终为真?if (b<a)(a-1)if (b<a)

上面的代码如何正确打印所有素数,从而正常工作?(根据我对if语句工作方式的有限理解,它不应该)

4

3 回答 3

4

if (b<a)考虑到 b 只会递增到 ,条件(第二个 if 语句的)将始终为真(a-1)

事实并非如此。如果没有找到除数,则 for 循环继续,直到条件b<a为假。发生这种情况时b == a,不会b == a-1。当循环条件为假时,循环体不会运行,但增量仍然发生。

于 2016-01-09T10:53:33.553 回答
2

这个循环

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

可以在两种情况下中断。第一个是什么时候a可以被整除b

  if (a % b == 0)
   break;

但是对于素数,这个条件总是等于假。

因此,循环将被中断的另一种情况是b在增量之后

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

将等于a。在这种情况下,条件

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

将等于 false 并且控制将传递给 if-else 语句。如果是,则b等于a并且a是素数。

于 2016-01-09T11:04:57.680 回答
1

首先,你是对的,之间的空格

if (b<a)
{
    ...
}

else
{
    ...
}

没关系。确实else属于.if

其次,if (b<a)总是正确的不是正确的。只要a % b == 0从未返回 true,循环就会继续b==a,直到条件失败。他们也可以写if (b!=a)

于 2016-01-09T10:55:45.527 回答