在C中使用Sierat of eratosthenes的素数

时间:2012-12-21 01:41:27

标签: c primes sieve-of-eratosthenes

我编写了以下程序来显示最多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;
}

3 个答案:

答案 0 :(得分:4)

  1. 您正在访问超出有效 [0-149] 范围的p[i*j]。当i*j <= 150等于150(即一个一个)时,条件i*j将评估为真。它应该是i*j < 150
  2. 缓冲stdout流。你需要在循环结束时进行刷新。尝试添加fflush(stdout)
  3. 可能不那么重要,但是如果你关心结果数组(例如:以后想要使用它),p[2]的值被错误地设置为1.但是,你的程序仍会打印2,但那是因为你的循环在更改p[i*j]的值之前打印了数字。总而言之,数字可以正确打印,但数组中的值并不完全正确。

答案 1 :(得分:1)

i*j <= 150不正确,应为i*j < 150,因为p数组包含从0149的元素。由于这个原因,程序陷入无限循环。

编辑:此答案的其余部分不正确,因此我已将其删除。

答案 2 :(得分:0)

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

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