欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

判断素数

程序员文章站 2024-03-15 15:54:11
...

po出大佬原博客https://www.cnblogs.com/linyujun/p/5198832.html

大佬讲了各种写法,非常的详细,这里只写埃筛和线筛两种。

埃筛 复杂度O(nloglogn)

#include<bits/stdc++.h>
using namespace std;
const int N=10000+6;
bool prime[N];
void init()
{
    for(int i=2;i<N;i++) prime[i]=true;
    for(int i=2;i*i<N;i++)
    {
        if(prime[i])
        {
            for(int j=i*i;j<N;j+=i)
            {
                prime[j]=false;
            }
        }
    }
}
int main()
{
    init();
    return 0;
}

这是埃筛,主函数可经过自己需要去填写。

线筛 复杂度O(n)

#include<bits/stdc++.h>
using namespace std;
const int N=100000+6;
bool prime[N];//prime[i]表示i是不是质数
int p[N],tot=0;//P[N]用来储存质数
void init()
{
    for(int i=2;i<N;i++) prime[i]=true;
    for(int i=2;i<N;i++)
    {
        if(prime[i]) p[tot++]=i;//把质数存起来
        for(int j=0;j<tot&&i*p[j]<N;j++)
        {
            prime[i*p[j]]=false;
            if(i%p[j]==0) break;//保证每个合数被他最小的质因子筛去
        }
    }
}
int main()
{
    init();
    return 0;
}

线筛的写法要比埃筛复杂一些。