素数打表。
#include<iostream> #include<math.h> #include<cstdio> #include<cstring> using namespace std; const int maxn=1000006; bool prim[maxn]; int L,U,N; int main() { int i,j,k; while(cin>>L>>U) { memset(prim,true,sizeof(prim)); N=U-L+1; if(L%2==0) k=0; else k=1; for(i=k;i<N;i+=2) prim[i]=false; k=(int )sqrt((double )U)+1; for(i=3;i<k;i+=2) { if(i>L&&prim[i-L]==0) continue; j=L/i*i;//求出不小于L的第一个要筛除的数 if(j<L) j+=i; if(j==i) j+=i; for(j=j-L;j<N;j+=i) prim[j]=0; } if(L<=1) prim[1-L]=false; if(L<=2) prim[2-L]=true; int max=0,min=maxn;bool find=false,flag=false; int f1,f2,c1,c2,m1,m2; for(i=0;i<N;i++) { if(prim[i]) { if(!find) { f1=i;find=true; } else { f2=i;flag=true; if(f2-f1>max) {max=f2-f1;m1=f1,m2=f2;} if(f2-f1<min) {min=f2-f1;c1=f1;c2=f2;} f1=f2; } } } if(flag) printf("%d,%d are closest, %d,%d are most distant.\n",c1+L,c2+L,m1+L,m2+L); else printf("There are no adjacent primes.\n"); } return 0; }