以下是一段代码,显示一个输出,说明用户输入的数字是否为素数。
#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 陈述的运作方式的有限理解,它不应该
答案 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)
。