素数的求法

文章目录


前言

提示:以下是本篇文章正文内容,下面案例可供参考

一、普通素数法

#include <iostream>
#include <math.h>
using namespace std;
int a[101];
bool zhinum(int x)
{
	if(x==1||x==0) return 0;
	for(int i=2;i<=sqrt(x);i++)
		if(x%i==0) return 0;
		return 1;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
		if(zhinum(a[i])) cout<<a[i]<<" ";
	}
	return 0;
}

二、六倍素数法

#include "iostream"
using namespace std;
int n;
bool isprime(int x){
    if(x==1) return 0;
    if(x==2||x==3||x==5) return 1;
    if(x%2==0||x%3==0) return 0;
    for (int i = 5; i*i <=x ; i+=6) {
        if(x%i==0||x%(i+1)==0) return 0;
    }
    return 1;
}
int main()
{
    cin>>n;
    for (int i = 2; i <=n ; ++i) {
        if(isprime(i)) cout<<i<<" ";
    }
    return 0;
}

三、欧拉筛

代码如下(示例):

#include <iostream>
#include <string.h>
using namespace std;
typedef  long long LL;
LL prime[100001];
bool vir[100000001];
int main()
{
	memset(prime,0,sizeof(prime));
	memset(vir,0,sizeof(vir));
	LL n;
	cin>>n; 
	vir[1]=true;
	for(LL i=2;i<=n;i++){
		if(!vir[i]){
			vir[i]=1;
			prime[++prime[0]]=i;
		}
		for(LL j=1;j<=prime[0]&&i*prime[j]<=n;j++){
			vir[prime[j]*i]=true;
			if(i%prime[j]==0) break;
		}
	}
	cout<<prime[0];
	for(int i=1;i<=prime[0];i++)
	cout<<prime[i]<<endl;
	return 0;
}

四、区间筛

代码如下(示例):

#include <bits/stdc++.h>
typedef long long LL;
using namespace std;
int prime[100001];
bool vis[1000010];
int oul(int n,int a[]){
	for(int i=2;i<=n;i++){
		if(!vis[i]){
			vis[i]=1;
			prime[++prime[0]]=i;
		}
		for(LL j=1;j<=prime[0]&&i*prime[j]<=n;j++){
			vis[i*prime[j]]=1;
			if(i%prime[j]==0) break;
		}
	}
	return prime[0];
}
int main()
{
	memset(prime,0,sizeof(prime));
	int cnt=oul(50000,prime);
	LL L,R;
	cin>>L>>R;
	L=L==1?2:L;
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=cnt;i++){
		for(LL j=max((LL)2,(L-1)/prime[i]+1)*prime[i];j<=R;j+=prime[i]){
			vis[j-L]=1;
		}
	}
	int ans=0;
	for(LL i=L;i<=R;i++){
		if(vis[i-L]==0) ans++;
	}
	cout<<ans;
	return 0;
}

上一篇:面试官:你知道怎么求素数吗?


下一篇:质数判断与质数筛法