素数相关/线性筛法

判断素数:

int sushu(int x)
{
    if(x<=1)return 0;
    for(int i=2; i<=sqrt(x); i++)
        if(x%i==0)
            return 0;
    return 1;
}

线性筛法:

const int N=1000+7;
ll  prime[N]= {1};
int pcnt=0;
int factor[N]= {1,1};
void Init_Prime()
{
    pcnt=1;
    for(ll i=2; i<N; i++)
    {
        if(!factor[i])
        {
            prime[pcnt++]=i;
            factor[i]=i;
        }
        for(ll j=1; j<pcnt&&i*prime[j]<N; j++)
        {
            factor[i*prime[j]]=prime[j];
            if(!(i%prime[j]))
                break;
        }
    }
    return;
}

普通筛法:

const int N=2000100;
int isprime[N];
void init()
{
    int i,j;
    isprime[1]=1;
    for(i=2; i<=sqrt(N); i++)
    {
        if(!isprime[i])
        {
            for(j=i+i; j<=N; j+=i)
                isprime[j]=1;
        }
    }
}

哈理工模板:

#include <stdio.h>
#include <string.h>
using namespace std;
const int N = 25600000;
bool a[N];
int p[N];
int n;
void Prime1()
{
    memset(a, 0, n * sizeof a[0]);
    int num = 0, i, j;
    for(i = 2; i < n; ++i) if(!a[i])
        {
            p[num++] = i;
            for(j = i+i; j < n; j +=i)
                a[j] = 1;
        }
}

void Prime2()
{
    memset(a, 0, n*sizeof a[0]);
    int num = 0, i, j;
    for(i = 2; i < n; ++i)
    {
        if(!(a[i])) p[num++] = i;
        for(j = 0; (j<num && i*p[j]<n); ++j)
        {
            a[i*p[j]] = 1;
            if(!(i%p[j])) break;
        }
    }
}
int main()
{
    n = 100;
    Prime2();
}

优化空间的线筛

for(int i=2; i<N; i++)
{
    if((isprime[i/32]&(1ll<<(i%32)))==0)
    {
        prime[tot++]=i;
    }
    for(int j=0; j<tot&&i*prime[j]<N; j++)
    {
        isprime[i*prime[j]/32]|=1<<(i*prime[j]%32);
        if(i%prime[j]==0)
            break;
    }
}

洛谷线筛:

#include <cstring>
#include<cstdio>
#include<iostream>//头文件
using namespace std;
long long prime[10000001],primesize;//prime[]表示素数,primesize表示素数个数 
bool isprime[10000001];//判断是否是质数 
void getlist(long long listsize)
{
    memset(isprime,1,sizeof(isprime));//将isprime赋初值 
    isprime[1]=false;//1既不是质数也不是合数所以赋初值为false 
    for(long long i=2;i<=listsize;i++)//listsize就是n,1被排除所以从2到n 
    {
        if(isprime[i])prime[++primesize]=i;//如果是就存下来 
         for(long long j=1;j<=primesize && i*prime[j]<=listsize;j++)//i*prime【j】肯定要数据范围内,所以《=n 
         {
            isprime[i*prime[j]]=false;//i*已知的所有素数定为合数 
            if(i%prime[j]==0)break;//避免多次筛,每个合数只被他最小的因子素数筛去 
        }
    }
}
int main()
{
    long long n,m,a;
    scanf("%lld%lld",&n,&m);//输入 
    getlist(n);//找出所有质数 
    for (int i=1;i<=m;++i) 
    {
        scanf("%lld",&a);//输入 
        if (isprime[a]!=false)//判断是否是质数 
        cout<<"Yes"<<endl;
           else cout<<"No"<<endl;
    }
    return 0; 
}

results matching ""

    No results matching ""