素数筛 poj 2689
素数筛
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define MAXN 47000 #define inf 100000000 bool z[MAXN]; int x[MAXN]; bool y[1001000]; int x1[1001010]; int main() { int a,b; for(int i=2;i<=220;i++) //可以从小的素数开始筛 { if(!z[i]) for(int j=i*i;j<MAXN;j+=i) z[j]=1; } int cnt=0; for(int i=2;i<MAXN;i++) //这个范围可以筛出2147483647 if(!z[i]) x[cnt++]=i; while(scanf("%d%d",&a,&b)!=EOF) { int m1=inf,m2=-1; int en=b-a; memset(y,0,sizeof(y)); if(a==1) a++; for(int i=0;i<cnt;i++) //b-a<=1000000 从a开始筛 { int a1,b1; a1=(a-1)/x[i]+1; b1=b/x[i]; for(int j=a1;j<=b1;j++) if(j>1) y[j*x[i]-a]=1; } int cnt1=0; for(int i=0;i<=b-a;i++) if(!y[i]) { x1[cnt1++]=i+a; } int i=0,j=cnt1-1; while(x1[i]<a) i++; while(x1[j]>b&&j>=0) j--; int l1,r1,l2,r2; for(int k=i;k+1<=j;k++) { if(x1[k+1]-x1[k]>m2) { m2=x1[k+1]-x1[k]; r2=x1[k+1]; l2=x1[k]; } if(x1[k+1]-x1[k]<m1) { m1=x1[k+1]-x1[k]; r1=x1[k+1]; l1=x1[k]; } } if(m2==-1) printf("There are no adjacent primes.\n"); else printf("%d,%d are closest, %d,%d are most distant.\n",l1,r1,l2,r2); } return 0; }
posted on 2016-12-14 18:30 HelloWorld!--By-MJY 阅读(160) 评论(0) 编辑 收藏 举报