素数的求法
作者:互联网
文章目录
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、普通素数法
#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;
}
标签:prime,return,vis,int,LL,vir,求法,素数 来源: https://blog.csdn.net/qq_45879198/article/details/117884347