【问题标题】:Using an If statement to find prime numbers使用 If 语句查找素数
【发布时间】: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&lt;a)(第二个 if 语句的)将始终为真。所以如果用户输入数字31,变量b只会递增到30。不应该是第二个printf语句吗? >if 语句被打印,无论用户输入的数字是否为素数,考虑到条件if (b&lt;a) 将始终为真?

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

【问题讨论】:

  • 您错过了for 循环中有条件break 的事实。这意味着它可以提前退出,而无需经历 for 循环的所有迭代。
  • @Rabbid76 - 你的意思是for (b = 2; b &lt; floor(sqrt(a)); b++) :-)
  • 谢谢大家的回答。
  • @AndrewCheong 不会是ceil(sqrt(a)) 吗?否则它告诉 49 是素数。

标签: c if-statement primality-test


【解决方案1】:

这个循环

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】:

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

    if (b<a)
    {
        ...
    }
    

    else
    {
        ...
    }
    

    没关系。 else确实属于if

    其次,if (b&lt;a) 始终为真不是真的。只要a % b == 0 从未返回true,循环就会一直持续到b==a,这使条件失败。他们也可以写if (b!=a)

    【讨论】:

    • 如果输入的a 的值为&lt;= 1if (b&lt;a) 优于if (b!=a)
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 2017-04-21
      • 2020-06-13
      • 2018-03-06
      相关资源
      最近更新 更多