使用数组计算素数

Calculating Prime numbers using arrays

我正在读一本名为 Stephen G. Kochan 的 C 语言编程的书,第 7 章的练习 7,我只介绍了变量、数据类型、算术表达式、程序循环、决策制定和使用数组,没有其他内容.

这道题要求我们使用名为 埃拉斯托色尼筛法 的算法显示前 150 个素数,其步骤如下所列 第一步:定义一个整数数组P。将所有元素P[i]设置为0,2<= i <=n 第 2 步:将 i 设置为 2 第 3 步:如果 i > n,算法终止。 第 4 步:如果 P[i] 为 0,则 i 为素数。 步骤5:对于j的所有正整数值,使得ij <= n,设置P[ij]为1 第 6 步:将 1 加到 i 并转到第 3 步。

我理解算法,但是当我尝试实现它时,它只返回 0。

//Sieve of Erastosthenes

#include <stdio.h>

int main (void)

{
  int i, j, P[151];


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

  for (i = 2; i <= 150; ++i ){

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

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

  }
    return 0;

}

此外,我知道我必须在我的程序中包含头文件才能使用 bool,我需要添加任何东西才能使用 double?

这个:

if (P[i] = 0)

不是测试,它是一个赋值(当然会产生一个由 if 测试的值,但实际表达式不是测试)。

C 有 = 用于赋值和 == 用于相等测试。启用更多编译器警告。

几件事:

练习是列出最多 150 个素数(不是前 150 个素数)。

你得到的每个答案都是 0,因为这个代码

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

应该改为阅读

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

您想打印 i -- 循环索引值 -- 而不是数组元素 P[i] 的值。