poj 2689

两次筛选。

代码:

#include<iostream>
#include<fstream>
#include<cmath>

using namespace std;

long long a[47001];
long long b[47001];
long long c[1000001];
int mark[1000001];


void read(){
//	ifstream cin("in.txt");
	long long i,j,k,top=0,top2;
	long long s,t,n1,n2,n3,n4;

	b[0]=2;
	for(i=4;i<=47000;i+=2)
		a[i]=1;
	for(i=3;i<=47000;i+=2)
		if(a[i]==0)
		{
			b[++top]=i;
			for(j=i*2;j<=47000;j+=i)
				a[j]=1;
		}
	while(cin>>s>>t){
		memset(mark,0,sizeof(mark));
		top2=0;
		if(s==1) s++;
		for(i=0;i<=top&&b[i]*b[i]<=t;i++)
		{
			j=s/b[i];
			if(j*b[i]<s) j++;
			if(j==1) j++;

			for(k=j*b[i];k<=t;k+=b[i])
				mark[k-s]=1;
		}
		for(i=s;i<=t;i++)
			if(mark[i-s]==0)
				c[top2++]=i;

		if(top2<=1)
		{
			cout<<"There are no adjacent primes."<<endl;

		}
		else
		{
			n3=1000001;n4=0;
			for(i=0;i<top2-1;i++)
			{
				if(c[i+1]-c[i]<n3)
				{
					n3=c[i+1]-c[i];
					n1=i;
				}
				if(c[i+1]-c[i]>n4)
				{
					n4=c[i+1]-c[i];
					n2=i;
				}
			}
			printf("%lld,%lld are closest, %lld,%lld are most distant.\n",c[n1],c[n1+1],c[n2],c[n2+1]);
		}
	}
}

int main(){
	read();
	return 0;
}

posted on 2011-04-12 16:47  宇宙吾心  阅读(326)  评论(0)    收藏  举报

导航