概述
1.最朴素的筛法O(nlogn)
void get_primes2(){
for(int i=2;i<=n;i++){
if(!st[i])
primes[cnt++]=i;//把素数存起来
for(int j=i;j<=n;j+=i)
{ //不管是合数还是质数,都用来筛掉后面它的倍数
st[j]=true;
}
}
}
2.埃氏筛法O(nloglogn)
void get_primes1(){
for(int i=2;i<=n;i++){
if(!st[i])
{
primes[cnt++]=i;
for(int j=i;j<=n;j+=i)
st[j]=true;//可以用质数就把所有的合数都筛掉;
}
}
}
3.线性筛法O(n)
void get_primes(int n)
{
for(int i = 2;i <= n;i++)
{
if(!st[i]) primes[cnt++] = i;
for(int j = 0;primes[j] * i <= n;j++)//筛选小于n的合数
{
st[primes[j] * i] = true;//用最小质因子去筛选合数
//重点:判断如果primes[j]是i的最小质因子,就应该退出循环
//防止重复
if(i % primes[j] == 0)
break;
}
}
}
大佬比较完善的解释:线性筛法
最后
以上就是无辜大神为你收集整理的关于筛素数的三种方法的全部内容,希望文章能够帮你解决关于筛素数的三种方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复