poj2689 Prime Distance
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
__int64 poww(__int64 a,__int64 b);
__int64 l,u;
__int64 np;
#define MAX 70000
__int64 p[MAX];
bool isprime[MAX];
void init()
{
np=0;
__int64 i,j;
for(i=2;i<MAX;i++)
{
if(isprime[i])
{
p[np++]=i;
}
for(j=0;j<np&&i*p[j]<MAX;j++)
{
isprime[i*p[j]]=false;
if(i%p[j]==0)
{
break;
}
}
}
}
#define hh 1000008
bool tag[hh];
__int64 res[hh];
__int64 cha[hh];
int main()
{
memset(isprime,true,sizeof(isprime));
memset(p,-1,sizeof(p));
init();
__int64 a,b;
__int64 i,j;
while(scanf("%I64d %I64d",&a,&b)!=EOF)//a对应0,b对应b-a
{
for(i=0;i<=b-a;i++)
{
tag[i]=true;
}
for(i=0;i<np&&p[i]*p[i]<=b;i++)
{
__int64 temp=a/p[i];
if(temp*p[i]!=a)
{
temp++;
}
if(temp==1)
{
temp++;
}
for(j=temp*p[i];j<=b;j+=p[i])
{
tag[j-a]=false;
}
}
int nima=0;
if(a==1)
{
tag[0]=false;
}
for(i=0;i<=b-a;i++)
{
if(tag[i])
{
res[nima++]=i+a;
}
}
for(i=0;i<nima-1;i++)
{
cha[i]=res[i+1]-res[i];
}
__int64 maxi,mini;
maxi=-1;
mini=-1;
for(i=0;i<nima-1;i++)
{
if(mini==-1||cha[i]<cha[mini])
{
mini=i;
}
if(maxi==-1||cha[i]>cha[maxi])
{
maxi=i;
}
}
if(mini==-1&&maxi==-1)
{
printf("There are no adjacent primes.\n");
}
else
{
printf("%I64d,%I64d are closest, %I64d,%I64d are most distant.\n",res[mini],res[mini+1],res[maxi],res[maxi+1]);
}
}
return 0;
}