论《素数的几种筛法》
第一种 试除法
每一个除一除,试一试就好了
bool prime(int n){ if(n<2)return false;for(int i=2;i<=n;i++){if(n%i==0)return false;}return true;
}
这个都会,不说了
优化:其实只用枚举至sqrt(n),就可以省掉一些时间
bool prime(int n){ if(n<2)return false;for(int i=2;i*i<=n;i++){if(n%i==0)return false;}return true;
}
优点:通俗易懂(在本题库能解决大部分素数)
缺点:很慢(请看后面)
第二种 埃筛
原理:写下2~n数字,先找出第一个数,将其倍数划去,再找新一个未被划去的数,再将其倍数划去,重复此步骤,最后得到的是素数
int primes[n],cnt;
bool v[n];
void aishai(int n){for(int i=2;i<=n;i++){if(v[i]) continue;primes[cnt++]=i;for(int j=i+1;j<=n;j+=i)v[j]=true;}
}
优点:可以快速筛出大量质数,可应对大量素数题目
第三种:线性筛(埃筛优化版)
这个不用说了,看代码:
int primes[n],cnt;
bool v[n];
void xianxingshai(int n){for(int i=2;i<=n;i++){if(!v[i]) primes[cnt++]=i;for(int j=0;i*primes[j]<=n;j++){v[primes[j]*i]=true;if(i%primes[j]==0) break;}}
}
优点:可应对绝大多数素数题目,很快