欧拉筛法

Posted 逃往火星的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉筛法相关的知识,希望对你有一定的参考价值。

作用:求出[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;
}

  

以上是关于欧拉筛法的主要内容,如果未能解决你的问题,请参考以下文章

欧拉筛法

质数判断(欧拉筛法)

线性筛法(欧拉筛法)求素数

埃氏筛法&欧拉筛法

欧拉筛法

欧拉筛转载自用