题目链接:点击打开链接;
题意:在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);//这个地方我就错两会,没带‘,’;
}
}