浅谈埃氏筛

前言

埃氏筛是一种筛2-n的素数方法,但是时间复杂度没有欧拉筛的强,只是O(n*loglogn)但是还是一种比较好理解的筛法

正文

一、素数的定义

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。(摘自百度百科)

二、算法详解

将2-n所有的数都标记为true,然后循环扫一遍,分别将每一个数的倍数标记为false(筛掉),以此类推。

三、代码实现

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e6;
 4 long long cc[maxn];
 5 bool vis[maxn];
 6 long long sum;
 7 /*筛素数函数开始*/
 8 void prime(int n)
 9 {
10     sum=0;//sum用来统计素数的个数
11     memset(vis,true,sizeof vis); //将vis数组全部标记为true
12     for(int i=2;i<=n;++i)
13     {
14         if(vis[i])
15         {
16             sum++;//sum随素数数量的增加而增加
17             cc[sum]=i; //将素数储存在cc数组里
18             for(int j=2*i;j<=n;j+=i)
19             {
20                 vis[j]=false;//将不是素数的数标记为false
21             } 
22         }
23     } 
24 }
25 /*函数结束*/
26 int main()
27 {
28     int n; 
29     cin>>n;
30         /*进行n=1时的特判*/
31     if(n==1)
32     {
33         cout<<"Possible"<<endl;
34     }
35         /*特判结束*/
36     prime(n);
37     for(int i=1;i<=sum;++i)
38     {
39         cout<<cc[i]<<" ";//输出即可
40     }
41     return 0;
42 }
43 

猜你喜欢

转载自www.cnblogs.com/Michael666/p/11626860.html