使用If语句查找素数

时间:2016-01-09 10:50:14

标签: c if-statement primality-test

以下是一段代码,显示一个输出,说明用户输入的数字是否为素数。

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

上面写的代码不是我的,它每次都成功识别一个素数(即 print 子句的 printf 语句被打印出来)。< / p>

我对 if 语句的理解是 if-else 语句中的 else 子句属于最近的 if < / strong>声明中没有 else 子句。所以,尽管如此,我相信上面一段代码中的 else 子句属于最近的 if 语句。

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

上面的代码如何正确打印所有素数,因此工作正常? (根据我对 if 陈述的运作方式的有限理解,它不应该

3 个答案:

答案 0 :(得分:4)

  

条件if (b<a)(第二个if语句)始终为真,因为b只会增加到(a-1)

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

答案 1 :(得分: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是素数。

答案 2 :(得分:1)

首先,你是对的,

之间的空白
if (b<a)
{
    ...
}

else
{
    ...
}

没关系。 else确实属于if

其次,if (b<a)总是如此,这是不正确的。只要a % b == 0永远不会返回true,循环就会一直持续到b==a,这会使条件失败。他们本可以写if (b!=a)