一、简介
线性筛,即欧拉筛,比起埃及筛,优点就是每个数直筛一遍。
线性筛的思想是“这个合数只会被它的最大非自身因数(对应最小质因数)筛”。
线性筛的时间复杂度为O(n)。
二、代码及解析
#include <bits/stdc++.h>
using namespace std;
int main()
{
bool a[50005];
a[1]=1;//注意1不是质数,也不是合数,这里标为不是质数,并不代表1是合数。
int p[50005],t;
for(int i=2; i<=n; i++)
{
if(a[i]==0)
{
p[++t]=i;//是质数就记录。
}
for(int j=1; j<=t&&i*p[j]<=n; j++)
{
a[i*p[j]]=1;//标记合数。
if(i%p[j]==0)
{
break;
}
//保证同一个合数不会被多个质数标记。
}
}
return 0;
}
最小质因数 × 最大因数(非自己) = 这个合数
为了方便理解,这里给出表格。
i | 质数 | 筛去的合数 |
2 | 2 | 4 |
3 | 2 3 | 6 9 |
4 | 2 3 | 8 |
5 | 2 3 5 | 10 15 25 |
以此类推 |
以上就是本文的全部内容啦!感谢阅读!