问题描述
蒜头君请你求出区间 [l,r] 上距离最近的相邻的素数对和距离最远的相邻的素数对。3,5 是相邻的素数,2,5 不是相邻的素数。距离定义为 2 个素数的差的绝对值。比如 5,7 距离为 2。
输入格式
输入 2 个整数l,r(1≤l≤r≤8000000)
输出格式
如果 a,b(a< b) 是距离最近的素数对,c,d(c< d) 是距离最远的素数对,按照如下格式输出a,b are closest, c,d are most distant. 。如果最近或者最远有多对,输出 a 和 c 最小的。如果没有相邻是素数对,输出There are no adjacent primes.。
样例输入
3 10
样例输出
3,5 are closest, 3,5 are most distant.
#include <iostream>
using namespace std;
bool is_prime[80000001];
int a[80000001];
int l,r;
int main()
{
cin>>l>>r;
for(int i=2;i<=r;i++){is_prime[i]=true;}
for(int i=2;i*i<=r;i++){
if(is_prime[i]){
for(int j=i*i;j<=r;j+=i){
is_prime[j]=false;
}
}
}
int j=0,ma=0,mi=80000001,max1=0,max2=0,min1=0,min2=0;
for(int i=l;i<=r;i++){
if(is_prime[i]){
a[j++]=i; //i赋值
}
}
for(int i=1;i<j;i++){ //取不到j
if(ma<a[i]-a[i-1]){
ma=a[i]-a[i-1];
max1=a[i-1];
max2=a[i];
}
if(mi>a[i]-a[i-1]){
mi=a[i]-a[i-1];
min1=a[i-1];
min2=a[i];
}
}
if(j==0||j==1) printf("There are no adjacent primes.");
else printf("%d,%d are closest, %d,%d are most distant.",min1,min2,max1,max2);
} // namespace std;