题目
解释
- 埃氏筛法
- 每次遇到质数,都将以它为底数的合数进行筛除
- 注意合数可能被筛除多次
- 线性筛法中
- 每次都是从第一个质数开始筛除prime*i的合数
- 因此保证每一个合数都只被它的最小质因数筛除,且只筛一次
- 因此是一种线性的被筛除
代码段
算法一埃氏筛法时间复杂度O(N)
#include<iostream>
using namespace std;
const int N=1e8+10;
bool st[N];
int prime[N],cnt;
int main()
{
long long n;
cin>>n;
for(int i=2;i<=n;i++)
{
if(!st[i])
{
prime[++cnt]=i;
for(int j=i+i;j<=n;j+=i)st[j]=true;
}
}
cout<<cnt<<endl;
}
算法二线性筛质数法
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
bool st[N];
int prime[N];
int cnt;
int main()
{
int n; cin >> n;
for (int i = 2; i <= n; i++)
{
if (!st[i])prime[cnt++] = i;
for (int j = 0; prime[j] * i <= n && prime[j]; j++)
{
st[prime[j] * i] = true;
if (i % prime[j] == 0)break;
}
}
cout << cnt << endl;
}