2

我编写了以下程序来显示最多 150 的所有素数。它根本没有执行。它有什么问题?

# include <stdio.h>
int main(void)
{
    int p[150], i, j;

    for (i = 2; i < 150; i++)
        p[i] = 0;

    i = 2;


    while (i < 150){

        if (p[i] == 0)
            printf("%i ", i);

        for (j = 1; i*j <= 150; j++)
            p[i*j] = 1;

        i++;
    }

    return 0;
}
4

3 回答 3

4
  1. 您正在访问p[i*j],它超出了有效的[0-149]范围。当等于 150时,条件i*j <= 150将评估为真,即相差一。i*j应该是i*j < 150
  2. 标准输出流被缓冲。您需要在循环结束时刷新。尝试添加一个fflush(stdout).
  3. 可能不太重要,但是如果您关心结果数组(例如:想稍后使用它),则值p[2]会错误地设置为 1。但是,您的程序仍会打印 2,但那是因为您的循环之前打印了数字改变 的值p[i*j]。最后,数字打印正确,但数组中的值并不完全正确。
于 2012-12-21T01:47:32.827 回答
1

i*j <= 150是不正确的,应该是i*j < 150,因为p数组有从0到的元素149。程序因此陷入无限循环。

编辑:这个答案的其余部分是不正确的,所以我把它删除了。

于 2012-12-21T01:53:18.993 回答
0

作为学习练习,尝试添加一些 printf 来了解您的程序的功能。

还要记住,正如 jweyrich 所说,没有 \n 的 printf 将不会输出任何内容,直到(可能)程序退出。

于 2012-12-21T01:49:18.167 回答