【问题标题】:Why isn't this program showing any number above 3?为什么这个程序没有显示任何大于 3 的数字?
【发布时间】:2019-02-23 10:10:34
【问题描述】:

写这个是为了找到21000之间的质数。但是在显示23 是素数后它就停止了。我知道我可以在互联网上找到如何编写代码来查找素数。但我真的需要知道这里出了什么问题。

#include <stdio.h>

main() {
    int i, j;
    int ifPrime = 1;
    for (i = 2; i < 1000; i++) {
        for (j = 2; j < i; j++) {
            if (i % j == 0) {
                ifPrime = 0;
                break;
            }
        }
        if (ifPrime == 1) {
            printf("%d is prime\n", i);
        }
    }
}

【问题讨论】:

  • 你在错误的地方初始化 ifPrime。
  • 阅读How to Debug Small Programs。调试技能就是编程技能
  • 请注意,您可以通过测试 j * j &lt;= i 显着加快内部循环,当 i 接近 1000 时,每个值可以节省超过 960 次迭代。即使检查也没有多大意义大于 2 的数字;他们不是素数。
  • @JonathanLeffler j &lt;= i/j 在更通用的代码中优于 j * j &lt;= i。它不会溢出。 j * j &lt;= ii == INT_MAX 是一个无限循环时。

标签: c


【解决方案1】:

线

int ifPrime=1;

必须在外部for 循环内。它将为每个i 初始化。这对应于自然语言单词“要检查一个数 i 是否为素数,首先假设它是。然后检查它是否可整除”。你之前的代码说“要检查数字 2 到 1000 是否是素数,首先假设它们是”,这个措辞太宽泛了。

代码应该是:

int main()
{
    for (int i = 2; i < 1000; i++)
    {
        int ifPrime = 1;
        for (int j = 2; j < i; j++)

我用int main 替换了main,因为这是20 年来的必需品。 (你不应该从这些老书中学习编程。)

我将int iint j 移动到for 循环中,这样您就不会在它们已定义值的范围之外意外使用这些变量。

为避免以后出现此错误,最好将is_prime 计算提取到单独的函数中。那么你将不得不在正确的位置初始化ifPrime

另一种查找此错误原因的方法是使用调试器单步执行代码,并在每一步问自己:程序在做什么仍然有意义吗?

【讨论】:

    【解决方案2】:

    在检查单个数字后,您没有将 ifPrime 设置回 1。所以一旦你得到一个非素数,ifPrime 现在是 0,因此if(ifPrime == 1) 永远不会返回真正的帖子,因此你只会看到 2、3 作为素数

    #include <stdio.h>
    
    int main(void) {
    
        for( int i=2;i<1000;i++)
        {
    
            int ifPrime = 1;
            for(int j=2;j<i;j++)
            {   
                if(i%j==0)
                {
                    ifPrime=0;
                    break;
                }
            }
            if(ifPrime==1)
            {
                printf("%d is prime\n",i);
            }
    
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-04
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      相关资源
      最近更新 更多