请你求出区间 [l,r] 上距离最近的相邻的素数对和距离最远的相邻的素数对。2,3 是相邻的素数,2,5 不是相邻的素数。距离定义为 2 个素数的差的绝对值。比如 2,3 距离为 1。
输入格式
输入 2 个整数 l,r(1≤l≤r≤9000000)
输出格式
如果 a, b(a < b)是距离最近的素数对,c,d(c < d)是距离最远的素数对,按照如下格式输出
a,b are closest, c,d are most distant.
如果最近或者最远有多对,输出 a 和 c 最小的。如果没有相邻是素数对,输出
There are no adjacent primes.
样例输入1
3 10
样例输出1
3,5 are closest, 3,5 are most distant.
样例输入2
14 17
样例输出2
There are no adjacent primes.
#include <iostream>
#include <cstdio>
using namespace std;
int a[8000005];
int main(){
for(int i = 0;i < 8000005;i ++){
a[i] = 1;
}
int l,r;
cin>>l>>r;
if(l == 1){//1不为质数
l = 2;
}
for(int i = 2;i*i<=r;i ++){//质数筛选
if(a[i]){
for(int j = i * i;j <= r;j += i){
a[j] = 0;
}
}
}
int flag = 0;//第一次判断时使用.
int maxx = 0,minn = 0;
int tempmaxx = 0,tempminn = 0;
int maxpointx = 0,maxpointy = 0;
int minpointx = 0,minpointy = 0;
int temp = 0;
for(int i = l;i <= r;i ++){
while(!a[i]&&i<r){
i ++;
}
if(a[i] == 1&&i <= r)
tempminn = i;
i++;
while(!a[i]&&i<r){
i++;
}
if(a[i] == 1&&i <= r)
tempmaxx = i;
// cout<<tempminn<<" "<<tempmaxx<<endl;
if(tempmaxx - tempminn > maxx||!flag){
flag = 1;
maxx = tempmaxx - tempminn;
maxpointx = tempminn;
maxpointy = tempmaxx;
}
if((tempmaxx - tempminn < minn&&tempmaxx - tempminn > 0)||!flag||minn == 0){//需要判断 minn = 0的时候情况
flag = 1;
minn = tempmaxx - tempminn;
minpointx = tempminn;
minpointy = tempmaxx;
}
i --;//要考虑本次的第二个数和下一次第一个数的关系,将其作为第一个数
}
if(!minn||!maxx||minpointx == 0||minpointy == 0||maxpointx ==0||maxpointy == 0){
cout<<"There are no adjacent primes."<<endl;
}else{
cout<<minpointx<<","<<minpointy<<" are closest, "<<maxpointx<<","<<maxpointy<<" are most distant."<<endl;
}
return 0;
}