这一讲中我们来谈一谈素数的筛法
一共有种常用的筛法
目录
——线性筛
只要用循环一下,然后用
的时间复杂度判断一下就好了
最简单,但时间复杂度最高
代码如下::
for(int i=l;i<=r;i++)
for(int j=2;j<=int(sqrt(i));j++)
if(i%j==0) {
flag[i]=1;
break;
}
——埃拉托斯特尼筛法
原理:从2开始,如果这个数还没被筛掉,那这个数就是素数,然后将以内的这个数的倍数筛掉
代码还是很好实现,时间复杂度居中
代码::
for(int i=2;i<=r;i++)
if(flag[i]==0)
for(int j=i*i;j<=r;j+=i)
flag[j]=1;
——欧拉筛法
在这个算法中,两层都是枚举质数
两个质数的乘积一定是合数
而且这个里面每一个数只被筛了一次
所以算法是的
for(int i=2;i<=n;i++) {
if(!h[i])
p[++cnt]=i;
for(int j=1;j<=cnt&&i*p[j]<=N;j++)
h[i*p[j]]=1;
}