关于筛法
埃筛(Eratosthenes筛法)人人都会
- 思想就是质数的倍数一定不是质数
埃筛瓶颈在于时间是O(nlog22n)O(nlog22n),数据太大会TLE
怎么办呢?
欧拉筛(线性筛法)
线性筛可以做到O(n)O(n)
思考筛到当前第ii个数,第jj个质数
不像埃筛,如果p[j]|ip[j]|i就直接breakbreak
因为p[j]p[j]是ii的约数,所以p[j]|i∗p[j+1]p[j]|i∗p[j+1]
这样后面的不用再筛了,均摊下来是O(n)O(n)时间复杂度
#include<stdio.h>
#include<string>
int check[100];
int tot = 0;
int prime[100];
void isprime(int n)
{
for (int i = 2; i <= n; ++i)
{
if (!check[i])
{
prime[tot++] = i;
}
for (int j = i+i; j <= n; j += i)
{
check[j] = 1;
}
}
}
int main()
{
int i,n;
scanf("%d",&n);
isprime(n);
for(i=0;i<tot;i++)
printf("%d ",prime[i]);
return 0;
}