自然数iが素数の場合、[i]を1に設定します。それ以外の場合は、0に設定します。最初に配列のすべての要素を1に設定して、素数でないことが証明されていないことを示します。次に、非素数(既知の素数の倍数)であることが証明されている配列の対応するインデックスにある要素を0に設定します。小さい素数の倍数がすべて0に設定されている場合、[i]はまだ1です。プライムです。
プログラムで使用される配列は、最も単純な要素タイプ(0と1の配列)で構成されるため、ビットで直接構成される配列は、整数で構成される配列よりもスペースを節約できます。さらに、Nの値が大きすぎる場合、一部のプログラミング環境では配列をグローバル変数として定義する必要があり、そのためのスペースを動的に割り当てることができます。
// Date:2020/4/12
// Author:xiezhg5
#include <stdio.h>
#define N 10000
int main(void)
{
int i,j,a[N];
for(i=2;i<N;i++)
a[i]=1;
for(i=2;i<N;i++)
{
if(a[i])
for(j=i;i*j<N;j++)
a[i*j]=0;
for(i=2;i<N;i++)
if(a[i])
printf("%4d ",i);
printf("\n");
}
return 0;
}
#include <stdlib.h>
int main(int argc,char *argv[])
{
long int i,j,N=atol(argv[1])
int *a=malloc(N*sizeof(int));
if(a==NULL)
{
printf("Insufficient memory.\n");
return;
}
...
}