使用数组的C中的Eratosthenes筛

时间:2013-07-02 12:31:55

标签: c arrays stdio sieve-of-eratosthenes math.h

我是C的初学者,我必须将Eratosthenes算法的Sieve转换为C代码。这是给出的算法: *开始 初始化数组is_prime以便所有的值 元素将为TRUE。 将is_prime [1]的值设置为FALSE(因为1不是素数。) 对于I = 2,直到sqrt(N)执行: 将I的所有倍数设置为FALSE,从I * I开始 直到N. 打印保存值为TRUE的is_prime的所有索引。 END *

到目前为止,这是我的代码:

#include <stdio.h>        
#include <math.h>

#define N 300             

void displayPrime (bool checkPrime);         
bool checkPrime (int num);

main()                    
{
     bool is_prime[N+1];         

     displayPrime(is_prime);

     getchar();      
}

void displayPrime (bool check)          
{
     int I;

     for(I=1; I<N; I++)
     {
              checkPrime(is_prime[I]);
              if(is_prime[I]==TRUE)
              {
                      printf("%d\n", I);
              }
              else if(is_prime[I]==FALSE)
              {
                      printf("");
              }
     }
}

bool checkPrime (int num)
{
     int num;

     is_prime[1]=FALSE;
     for(I=2; I<=sqrt(N); I++)
     {
              for(num=I; num<=N/num; num=num*I)
              {
                      is_prime[num]=FALSE;    
              }         
              return(is_prime[I]);
     }

}

该程序无法编译,我想知道该程序有什么问题。谢谢

1 个答案:

答案 0 :(得分:2)

我没有研究算法。这是工作代码(使用visual studio):

#include <stdio.h>        
#include <math.h>

#define N 300             

void displayPrime (bool checkPrime);         
bool checkPrime (int num);
bool is_prime[N+1];


void displayPrime (bool check)          
{
     int I;

     for(I=1; I<N; I++)
     {
              checkPrime(is_prime[I]);
              if(is_prime[I]==true)
              {
                      printf("%d\n", I);
              }
              else if(is_prime[I]==false)
              {
                      printf("");
              }
     }
}

bool checkPrime (int num)
{
     int I;
     is_prime[1]=false;
     for(I=2; I*I<=N; I++)
     {
              for(num=I; num<=N/num; num=num*I)
              {
                      is_prime[num]=false;    
              }         
              return(is_prime[I]);
     }

}

void main()                    
{

     displayPrime(is_prime);

     getchar();      
}

我改变了这些事情:

  1. 您不能两次声明变量。
  2. 每个变量都可以在范围{}
  3. 中使用
  4. 调用之前应该声明一个函数。
  5. TRUE应为trueFALSE应为false
  6. 在main函数中使用return类型。
  7. 无论如何Sieve有很多很好的实现。尝试一下。