您的位置:首页 > 其它

素数判断(朴素、高效)

2016-08-13 10:31 225 查看
朴素判定(这个比较常用)

bool prime(int x)
{
for(int i=2;i*i<=x;i++)
if(x%i==0) return 0;
return x<=1?0:1;
}


高效判定

bool prime(int x)
{
if(x==2||x==3) 			   return 1;
if(x%6!=1&&x%6!=5)         return 0;
for(int i=5;i*i<=x;i+=6)
if(x%i==0||x%(i+2)==0) return 0;
return x==1?0:1;
}


朴素打表(比较还是觉得这个好)

void prime()
{
memset(p,1,sizeof p);
for(int i=2;i<N;i++)
if(p[i])
for(int j=i+i;j<N;j+=i)
p[j]=0;
p[0]=p[1]=0;
}



高效打表

void prim()
{
int x[6]={0,4,0,0,0,2};
for(int i=5;i*i<N;i+=x[i%6])
for(int j=i;i*j<N;j+=x[j%6])
p[i*j]=1;
p[1]=1;
}
bool prime(int x)
{
if(x==2||x==3) return 1;
if(x%6==1||x%6==5)
if(p[x]==0) return 1;
return 0;
}


经典例题:http://poj.org/problem?id=2689

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
const int N=50000+100;
const int inf=0x3f3f3f3f;
int r[1000000],a
,b
,z=0;
int main()
{
for(int i=2;i<=N;i++)
if(!a[i])
{
b[++z]=i;
for(int j=i*2;j<=N;j+=i) a[j]=1;
}
int x,y;
while(cin>>x>>y)
{
memset(r,0,sizeof r);

for(int i=1;i<=z;i++)
{
int s,t;
s=(x-1)/b[i]+1;
t=y/b[i];
for(int j=s;j<=t;j++)
if(j>1) r[j*b[i]-x]=1;
}
int k=-1,ma=-1,mi=inf,m1,m2;
for(int i=0;i<=y-x;i++)
if(!r[i])
{
if(k!=-1)
{
int dis=i-k;
if(dis>ma) ma=dis,m1=i+x;
if(dis<mi) mi=dis,m2=i+x;

}
if(i+x!=1) k=i;
}
if(ma<0) cout<<"There are no adjacent primes."<<endl;
else     cout<<m2-mi<<','<<m2<<" are closest, "<<m1-ma<<','<<m1<<" are most distant."<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: