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

欧拉筛&&线性筛

时间:2018-12-07 16:45:48      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:重复   改进   ==   name   复杂度   eof   ems   end   pac   

复杂度

n

分析

其实就是把埃筛的改进罢了,避免重复
具体看代码

代码

#include<bits/stdc++.h>
using namespace std;
bool vis[10000000];
int prime[10000];
int Oulashai(int n){
    memset(vis,0,sizeof(vis));
    int cnt=0;
    for(int i=2;i<=n;i++){
        if(!vis[i]) prime[cnt++]=i;
        for(int j=0;j<cnt&&i*prime[j]<=n;j++){
            vis[i*prime[j]]=true;
            if(i%prime[j]==0) break;
            //这个地方关键因为 
            //i%prime[j]==0,可以把i看做prime[j]*x,那么(k>i)i*prime[k]==prime[j]*x*prime[k];
            //又可以把 x*prime[k]另一个数,那么将来的某次循环会把i*prime[k]==prime[j]*x*prime[k]
            //给筛了,从而避免了重复 
        }
    }
    return cnt;
} 
int main(){
    int n,i; 
    while(cin>>n){
        for(i=0;i<Oulashai(n);i++)
        {
            cout<<prime[i]<<‘ ‘;
        if(i%10==0) cout<<endl;
        }
    }
    return 0;
}

欧拉筛&&线性筛

标签:重复   改进   ==   name   复杂度   eof   ems   end   pac   

原文地址:https://www.cnblogs.com/mch5201314/p/10083503.html

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