Sol:筛选素数就可以了。。。。(模版题)
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <iostream>
using namespace std;
const int maxn = 100000 + 10;
const int maxm = 1000000 + 10;
int prime[maxn+1];
void getprime()
{
memset(prime,0,sizeof(prime));
for(int i=2;i<=maxn;i++)
{
if(!prime[i])
prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]<=maxn/i;j++)
{
prime[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
bool notprime[maxm];
int prime2[maxm];
void getprime2(int L,int R)
{
memset(notprime,false,sizeof(notprime));
if(L<2) L=2;
for(int i=1;i<=prime[0]&&(long long)prime[i]*prime[i]<=R;i++)
{
int s=L/prime[i]+(L%prime[i]>0);
if(s==1) s=2;
for(int j=s;(long long)j*prime[i]<=R;j++)
if((long long)j*prime[i]>=L)
notprime[j*prime[i]-L]=true;
}
prime2[0]=0;
for(int i=0;i<=R-L;i++)
if(!notprime[i])
prime2[++prime2[0]]=i+L;
}
int main()
{
getprime();
int L,U;
while(~scanf("%d%d",&L,&U))
{
getprime2(L,U);
if(prime2[0]<2)
printf("There are no adjacent primes.\n");
else
{
int x1=0,x2=100000000,y1=0,y2=0;
for(int i=1;i<prime2[0];i++)
{
if(prime2[i+1]-prime2[i]<x2-x1)
{
x1=prime2[i];
x2=prime2[i+1];
}
if(prime2[i+1]-prime2[i]>y2-y1)
{
y1=prime2[i];
y2=prime2[i+1];
}
}
printf("%d,%d are closest, %d,%d are most distant.\n",x1,x2,y1,y2);
}
}
return 0;
}