埃筛
2020-08-04 本文已影响0人
dachengquan
埃筛
给定一个整数N,求出1~N之间的所有质数,称为质数的筛选问题。埃筛线筛都是用于解决这个问题的算法。
埃筛的思想是任意一个整数x的倍数都不是质数。从2开始,从小到大扫描每一个x,将他的倍数全部标记为合数。
优化策略1,对于4来说,4的倍数都已经被2标记过一次了。没有必要在进行一次标记。如果一个数x是合数,那么他的倍数会被比x小的数,并且是x的质因数标记过。没有必要在标记一次。
优化策略2,对于5来说,10被2标记了,15被3标记过,20被2标记过。当我们标记p*x时,如果p<x那么p*x已经被p的质因子标记过了。没有必要在进行标记了。
如果我们只采用优化策略1,那么每个数x,会被他的不同的质因数标记一次。例如12会被2和3标记一次。int范围内的数最大的合数也只会被标记10次。埃筛的时间复杂度非常接近线性。
void primes(int n){
memset(v,0,sizeof(v))
for(int i = 2;i<=n;i++){
if(v[i])continue;
for(int j = i;j<=n/i;j++) v[i*j] = 1;
}
}