poj2689 Prime Distance

 

#include <stdio.h>
#define size 46341


int pri[size],prime[size],ans[1000010],in[1000010],pcnt,left,right,minl,maxl,maxr,minr,mn,mx,anscnt,start,end;


//选出46341以内的素数
void Generate()
{
 int i,j;
 for(i=2;i<size;i++)
 {
  pri[i]=1;
 }
 for(i=2;i<size;i++)
 {
  if(!pri[i])
  {
   continue;
  }
  for(j=i*i;j<size;j+=i)
  {
   pri[j]=0;
  }
 }
 pcnt=0;
 for(i=2;i<size;i++)
 {
  if(pri[i])
  {
   prime[pcnt++]=i;//prime数组存储46341以内的素数,pcnt为prime存储的数据个数
  }
 }
}
void GetPrime()
{
 int i,j;
 anscnt=0;
 if(right<size)
 {
  for(i=left;i<=right;i++)
  {
   if(pri[i])
   {
    ans[anscnt++]=i;//ans==prime
   }
  }
 }
 else
 {
  end=right-left+1;
  for(i=0;i<end;i++)
  {
   in[i]=1;
  }
  for(i=0;i<pcnt;i++)
  {
   start=left/prime[i]*prime[i];//start>=prime[i]&&start=x*prime[i]
   if(start<left)
   {
    start+=prime[i];
   }
   start-=left;//映射到数组下标
      for(j=start;j<end;j+=prime[i])
   {
    in[j]=0;
   }
  }
  for(i=0;i<end;++i)
  {
   if(in[i])
   {
    ans[anscnt++]=i+left;//ans=prime[i]+x
   }
  }
 }
}
void Choose()
{
 int i;
 mn=ans[1]-ans[0];
 mx=ans[1]-ans[0];
 minl=maxl=ans[0];
 minr=maxr=ans[1];
 for(i=1;i<anscnt;i++)
 {
  if(ans[i]-ans[i-1]<mn)
  {
   mn=ans[i]-ans[i-1];
   minl=ans[i-1];
   minr=ans[i];
  }
  if(ans[i]-ans[i-1]>mx)
  {
   mx=ans[i]-ans[i-1];
   maxl=ans[i-1];
   maxr=ans[i];
  }
 }
}
void Accept()
{
 Generate();
 for(;scanf("%d%d",&left,&right)==2;)
 {
  GetPrime();
  Choose();
  if(anscnt<2)
  {
   printf("There are no adjacent primes.\n");
  }
  else
  {
   printf("%d,%d are closest, %d,%d are most distant.\n",minl,minr,maxl,maxr);
  }
 }
}


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

你可能感兴趣的:(poj2689 Prime Distance)