1

私は C の初心者で、エラトステネスのふるいアルゴリズムを C コードに変換する必要があります。与えられたアルゴリズムは次のとおりです。 *START 要素のすべての値が TRUE になるように、配列 is_prime を初期化します。is_prime[1] の値を FALSE に設定します (1 は素数ではないため)。 I=2 の場合、sqrt(N) まで実行: I*I から N まで、I のすべての倍数を FALSE に設定します。値 TRUE を保持する is_prime のインデックス。終わり*

これまでの私のコードは次のとおりです。

#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]);
     }

}

プログラムがコンパイルされません。プログラムの何が問題なのか疑問に思っています。ありがとうございました

4

1 に答える 1

2

私はアルゴリズムを調べていません。これは作業コードです(ビジュアルスタジオを使用):

#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 回宣言することはできません。
  2. すべての変数はスコープ内で使用できます{}
  3. 呼び出される関数は、呼び出す前に宣言する必要があります。
  4. TRUEあるべきでtrueあり、FALSEあるべきですfalse
  5. メイン関数で戻り値の型を使用します。

とにかくSieve良い実装がたくさんあります。それらを試してみてください。

于 2013-07-02T12:59:28.380 に答える