Eratosthenes筛法是一种素数筛,时间复杂度nlogn。
主要思想就是,对于小于n的素数p,删除2p,3p,4p……
筛法的代码可以写成:
memset(vis,0,sizeof(vis));
for(int i=2;i<=M;i++)
for(int j=i*2;j<=n;j+=i) vis[j] = 1;
虽然这样已经很快了,但是还是可以进一步优化。
int M = sqrt(n+0.5)
memset(vis,0,sizeof(vis));
for(int i=2;i<=M;i++)
if(!vis[i])
for(int j=i*i;j<=n;j+=i) vis[j] = 1;
内层循环不用每次从i*2开始,小于i的在之前就已经筛掉了,所以只要从i*i开始就可以,所以第一层循环也就不必循环到n,只要循环到根号n就可以。
代码很简单,在此想引入一下素数定理:,素数定理可以用于预处理时,开数组的大小。
其中Π(x)表示不超过x的素数的个数,就是它和x/lnx比较接近。