【发布时间】:2016-04-14 01:11:56
【问题描述】:
以下是一段代码,它显示了一个输出,说明用户输入的数字是否为质数。
#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 只会增加到 (a-1),条件 if (b<a)(第二个 if 语句的)将始终为真。所以如果用户输入数字31,变量b只会递增到30。不应该是第二个的printf语句吗? >if 语句被打印,无论用户输入的数字是否为素数,考虑到条件if (b<a) 将始终为真?
上述代码如何正确打印所有素数,从而正常工作? (根据我对 if 语句工作方式的有限理解,它不应该)
【问题讨论】:
-
您错过了
for循环中有条件break的事实。这意味着它可以提前退出,而无需经历for循环的所有迭代。 -
@Rabbid76 - 你的意思是
for (b = 2; b < floor(sqrt(a)); b++):-) -
谢谢大家的回答。
-
@AndrewCheong 不会是
ceil(sqrt(a))吗?否则它告诉 49 是素数。
标签: c if-statement primality-test