利用一个小区间的素数表来推出目标区间的素数表,再来求解。。。。算是对筛选素数的一个经典应用了。。。。做起来很有意思。。。(int 会RE的)
#include <cstdio> #include<iostream> #include<cstring> using namespace std; #define maxlen 46500 bool a[maxlen],next_prim[1000010]; long long prim[maxlen],p=0,l,u; inline void isp(){ memset(a,1,sizeof(a)); a[0]=a[1]=0; for(long long i=2;i<maxlen;i++) if(a[i]){ prim[p++]=i; for(long long j=i*i;j<maxlen;j+=i) a[j]=0; } } void next_isp(){ memset(next_prim,1,sizeof(next_prim)); for(long long i=0,k;i<p && prim[i]*prim[i]<=u;i++){ k=l/prim[i]+(l%prim[i]>0); if(k==1) k=2; for(long long j=k*prim[i];j<=u;j+=prim[i]) next_prim[j-l]=0; } } int main(int argc, char** argv) { long long ans1,ans2,ans3,ans4,max1,min1,i,flag; isp(); while(scanf("%lld%lld",&l,&u)!=-1){ if(l==1) l=2; next_isp(); max1=INT_MAX; min1=-1; long long tmp=0; for(i=l,flag=0;i<=u;i++){ if(next_prim[i-l]){ flag++; if(flag>1){ if(i-tmp<max1){ max1=i-tmp; ans1=tmp; ans2=i;} if(i-tmp>min1){ min1=i-tmp; ans3=tmp; ans4=i;} } tmp=i; } } if(flag<2) printf("There are no adjacent primes.\n"); else printf("%lld,%lld are closest, %lld,%lld are most distant.\n",ans1,ans2,ans3,ans4); } return 0; }