下面是一段代码,显示输出,说明用户输入的数字是否是素数。
#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 (b<a)
,条件 (a-1)
(第二个 if语句的)将始终为真。因此,如果用户输入数字 31,则变量 b 只会增加到 30。难道不应该打印第二个 if 语句的 printf 语句吗,无论数字是否考虑到条件
if (b<a)
始终为真,用户输入的是否为素数?
上面的代码如何正确打印所有素数,从而正常工作? (根据我对 if 语句工作方式的有限理解,它不应该)
考虑到 b 只会增加到
,条件if (b<a)
(第二个 if 语句)将始终为真。(a-1)
事实并非如此。如果找不到除数,则 for 循环继续,直到条件
b<a
为假。这种情况发生在 b == a
时,而不是 b == a-1
时。当循环条件为 false 时,循环体不会运行,但增量仍然发生。
这个循环
for (b = 2; b < a; b++)
{
if (a % b == 0)
break;
}
在两种情况下可以被中断。第一个是当
a
能被 b
整除时
if (a % b == 0)
break;
但对于素数,这个条件总是等于 false。
因此循环中断的另一种情况是当增量
之后
b
时
for (b = 2; b < a; b++)
^^^
将变得等于
a
。在这种情况下
for (b = 2; b < a; b++)
^^^^^
将等于 false 并且控制将传递给 if-else 语句。 如果是这样,那么
b
等于 a
并且 a
是质数。
首先,你是对的,
之间的空格if (b<a)
{
...
}
和
else
{
...
}
没关系。
else
确实属于if
。
其次,
if (b<a)
并不总是正确的。只要 a % b == 0
从未返回 true,循环就会一直持续到 b==a
,这会导致条件失败。他们也可以写 if (b!=a)
。
这是通过使用 if else 来查找数字是否为质数的最简单方法。
导入java.util.Scanner;
公开课主课{
public static void main(String[] args) {
System.out.print("Please enter a number:");
Scanner Scan = new Scanner (System.in);
int number = Scan.nextInt();
if (number==2||number==3||number==5)
System.out.println(number + " is a prime num");
else if(number%2==0||number%3==0||number%5==0)
System.out.println(number + " not prime num");
else
System.out.println(number + " is a prime num");
}
}