素數判斷(樸素、高效)

樸素判定(這個比較常用)

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[N],b[N],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;
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章