题目链接:点击打开链接;
题意:在l和u之间找到相邻的素数差最大和最小的打印出来。没有输出There are no adjacent primes.
分析:本题数据很大,所以int不能存下,所以用long long,此外,正常的素数筛法不能筛出这么的素数。然而我观察到l和u之间距离为1000000,所以只需要筛出l和u之间的素数就好了,并且,在小于2147483647的所有的数为素数和sqrt(2,147,483,647)中的素数的倍数。所以先筛出sqrt(2,147,483,647)这些素数,再用这些素数筛出l和u之间的素数
注意:不要打错和少打字符。
#include <set> #include <map> #include <stack> #include <queue> #include <math.h> #include <vector> #include <utility> #include <string> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <functional> using namespace std; const int N=50005; bool isprime[N*20]; long long prime_1[N]; long long prime_2[N]; long long l,u; int prime_num=0; void prime1(){ memset(isprime,1,sizeof(isprime)); isprime[1]=isprime[0]=false; for(int i=2;i<N;i++){ if(isprime[i]) prime_1[prime_num++]=i; for(int j=0;j<prime_num&&i*prime_1[j]<N;j++){ isprime[i*prime_1[j]]=false; if(!(i*prime_1[j]))break; } } }// 线性筛法 int prime_num_2; void prime2(){ long long i,j,b; memset(isprime,1,sizeof(isprime)); for(i=0;i<prime_num;i++){ b=l/prime_1[i]; while(b*prime_1[i]<l||b<=1) b++; for(j=b*prime_1[i];j<=u;j+=prime_1[i]){ if(j>=l){ isprime[j-l]=false; } } if(l==1){ isprime[0]=false; } } }//普通筛法 int main() { prime1(); while(cin>>l>>u){ prime2(); prime_num_2=0; for(int i=0;i<=u-l;i++){ if(isprime[i]){ prime_2[prime_num_2]=i+l; prime_num_2++; } } if(prime_num_2<=1){ puts("There are no adjacent primes."); continue; } long long minn,maxx,minn_x,minn_y,maxx_x,maxx_y; maxx=-99999999999ll; minn=99999999999ll; for(int i=1;i<prime_num_2;i++){ // cout<<prime_2[i]<<endl; long long sum=prime_2[i]-prime_2[i-1]; if(sum>maxx){ maxx=sum; maxx_x=prime_2[i-1]; maxx_y=prime_2[i]; } if(sum<minn){ minn=sum; minn_x=prime_2[i-1]; minn_y=prime_2[i]; } } printf("%I64d,%I64d are closest, %I64d,%I64d are most distant.\n",minn_x,minn_y,maxx_x,maxx_y);//这个地方我就错两会,没带‘,’; } }