题目描述
蒜头君请你求出区间 [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(14 17)
样例输出
3,5 are closest, 3,5 are most distant.(There are no adjacent primes.)
AC代码
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
bool is_prime[8000000];
int aa[8000000];
int main(){
int l,r;
cin>>l>>r;
for(int i = 0;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 o = 0;
for(int i = l;i<=r;i++){
if(is_prime[i]&&i!=1){
aa[o] = i;
//cout<<aa[o];
o++;
}
}
//cout<<o;
int min=8000005;
int max = 0;
int x,y;
int g,d;
if(o<=1){
printf("There are no adjacent primes.");
}else {
for (int i = 0; i < o-1; i++) {
if ( abs(aa[i + 1] - aa[i])< min) {
min = abs(aa[i + 1] - aa[i]);
//cout<<aa[i+1]<<"-"<<aa[i]<<endl;
x = aa[i];
y = aa[i + 1];
}
}
for (int i = 0; i < o-1; i++) {
if (abs(aa[i + 1] - aa[i]) > max) {
max = abs(aa[i + 1] - aa[i]);
//cout<<aa[i+1]<<"-"<<aa[i]<<endl;
g = aa[i];
d = aa[i + 1];
}
}
printf("%d,%d are closest, %d,%d are most distant.", x, y,g,d);
}
return 0;
}