码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉筛法

时间:2018-04-01 21:58:15      阅读:329      评论:0      收藏:0      [点我收藏+]

标签:说明   ++i   memset   binary   需要   log   复杂度   筛法   end   

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

  

欧拉筛法

标签:说明   ++i   memset   binary   需要   log   复杂度   筛法   end   

原文地址:https://www.cnblogs.com/l1l1/p/8688253.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!