3.1ふるい方法

エリクセンふるい方法

  • 2が最も小さい素数であるN記載されているために範囲2内の最初の整数。
  • 3は素数であるので、表2に交差すべての倍数は、テーブルの残りの部分は最も小さい番号3で、彼は、小さい番号割り切れすることはできません。
  • 次に、表3消さ......そう、すべての倍数。
  • テーブルの残りの最小数はMである場合、mが素数です。
  • その後、消さすべてのmに対して複数のテーブルには、操作は次のように繰り返され、私たちは、列挙子プライムn個の中に変えることができます。
2
2
2
  • 時間の複雑さがある\(O(nlog(LOGN) )\)
  • サンプルコードは、以下の
bool h[10000005]={0}
void E(int n)
{
    for(int i=2; i<=n; i++)
    {
        if(h[i]) continue;
        for(int j=2; j*i<=n; j++) h[j*i]=1;
    }
}

例は:素数内の正の整数N(N <= 10 ^ 6)、QがN数を考慮しますか?

int prime[MAXN];//第i个素数
bool is_pri[MAXN+10];//is_pri[i]表示i是素数
//返回n以内素数的个数
int sieve(int n)
{
    int p=0;
    for(int i=0;i<=n;i++) is_pri[i]=true;
    is_pri[0]=is_pri[1]=false;
    for(int i=2; i<=n; i++)
    {
        if(is_pri[i])
        {
            prime[++p]=i;
            for(int j=2*i; j<=n; j+=i) is_pri[j]=false;
        }
    }
    return p;
}

おすすめ

転載: www.cnblogs.com/orange-233/p/12397284.html