1. 程式人生 > >歐拉篩法

歐拉篩法

urn AI ace earch cout bre ostream OS 復雜度

作用:求出[2,N]內所有素數。

算法:每個合數必有一個素數因子,利用已知素數去篩除合數。

說明:因為答案數組是從1開始的,所以用binary_search( ) 、lower_bound( )和upper_bound( ) 函數不需要另行判斷,但註意寫法要均加1 ---------------(Ans_p+1,Ans_p+tot+1,x) 。

代碼

時間復雜度:近似O(n)

輸入:n 所需素數範圍

輸出:函數內部賦值於Ans_p數組

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;

const int MaxN=1000010;//設置最大範圍
bool flag[MaxN];//標記數組
int Ans_p[MaxN],tot;//素數表,總素數個數,註意(Ans_p[tot])內有素數

void eulgp(int n)//2~n 內的素數
{
    tot=0;                         //初始化
    memset(flag,-1,sizeof(flag));

    for(int i=2;i<=n;++i)
    {
        if(flag[i])
            Ans_p[++tot]=i;         //存入素數
        for(int j=1;(j<=tot)&&(i*Ans_p[j]<=n);++j)
        {
            flag[i*Ans_p[j]]=0;
            if(i%Ans_p[j]==0)       //避免重復賦0及時跳出
                 break;
        }
    }
}

int main()
{
    int n,m,x;
    cin>>n>>m;//輸入素數範圍及需要判斷的次數
    eulgp(n);
    while(m--)
    {
        cin>>x;
        if(binary_search(Ans_p+1,Ans_p+tot+1,x))//此為STL二分函數判段有無,
            cout<<"Yes"<<endl;                  //有1,無0
        else
            cout<<"No"<<endl;
    }
    return 0;
}

  

歐拉篩法