题目地址:http://poj.org/problem?id=2689
解析:直接把sqrt(22*10e8)以内的素数筛选出并保存下来,然后对L——u内的数进行筛选,剩下的就是素数了。
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
#define INF 0x7fffffff
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a>b?b:a
#define N 101
int flag[50000];
ll prime[10000];
ll sign[1000005];
int q=0;
void init()
{
ll i,j;
for(i=2;i*i<=50000;i++)
{
if(flag[i]) continue;
prime[q++]=i;
for(j=i*i;j<50000;j+=i)
flag[j]=1;
}
for(i;i<50000;i++)
if(!flag[i]) prime[q++]=i;
}
ll g[200000];
int main()
{
ll i,j,k,t;
ll m,n;
ll a,b;
ll p;
init();
while(cin>>a>>b)
{
memset(sign,0,sizeof(sign));
p=0;
for(j=0;j<q;j++)
{
k=a/prime[j];
while(k*prime[j]<a||k<=1) k++;
for(ll l=k*prime[j];l<=b;l+=prime[j]) //用ll以免越界
{
if(l>=a) sign[l-a]=1;
}
}
if(a==1) sign[0]=1; //1的特殊情况
for(i=a;i<=b;i++)
{
if(!sign[i-a]) g[p++]=i;
}
if(p<=1)
{
cout<<"There are no adjacent primes."<<endl;
continue;
}
ll Min=INF;
ll Max=-INF;
ll stx,sty,edx,edy;
for(i=1;i<p;i++)
{
ll mid=g[i]-g[i-1];
if(Min>mid)
{
Min=mid;
stx=g[i-1];
sty=g[i];
}
if(Max<mid)
{
Max=mid;
edx=g[i-1];
edy=g[i];
}
}
cout<<stx<<","<<sty<<" are closest, "<<edx<<","<<edy<<" are most distant."<<endl;
}
return 0;
}