蒜头君请你求出区间 上距离最近的相邻的素数对和距离最远的相邻的素数对。
是相邻的素数,
不是相邻的素数。距离定义为
个素数的差的绝对值。比如5,7 距离为 2
。
输入格式
输入 个整数
输出格式
如果
是距离最近的素数对,
是距离最远的素数对,按照如下格式输出a,b are closest, c,d are most distant.
。
如果最近或者最远有多对,输出
和
最小的。如果没有相邻是素数对,输出There are no adjacent primes.
。
样例输入
3 10
样例输出
3,5 are closest, 3,5 are most distant.
扫描二维码关注公众号,回复: 5385274 查看本文章
样例输入
14 17
样例输出
There are no adjacent primes.
解:
所求素数对必须相邻,且要保存两数。这样需保存6个变量,距离最大最小的左右值以及他们的距离。
选找前,先用向量
储存每个数,下标表示数,保存元素0、1表示是否为素数。
再用优化方法,筛选素数。
(筛选方法地址:质素筛选)
利用变量
来保存前一个质数。
代码:
#include"iostream"
#include"vector"
#include"algorithm"
using namespace std;
int main()
{
vector<int> is_prime;
int maxr=0,maxl=0,max=0;
int minr=0,minl=0,min=80000001;
int flag=0,temp=0;
int l,r;
cin>>l>>r;
//筛选质数
is_prime.push_back(0);//0
is_prime.push_back(0);//1
for (int i = 2; i <= r; ++i) {
is_prime.push_back(1);
}
for (int i = 2; i * i <= r; ++i) {
if (is_prime[i]) {
for (int j = i * i; j <= r; j +=i) {
is_prime[j] = 0;
}
}
}
for(int i=l;i<=r;i++){
if(is_prime[i]){
if(maxl==0&&flag==0){
temp=i;
flag=1;
continue;
}
if(i-temp>max){//判断最大
max=i-temp;
maxl=temp;
maxr=i;
}
if(i-temp<min){//判断最小
min=i-temp;
minr=i;
minl=temp;
}
temp=i;
}
}
if(maxl==0){
cout<<"There are no adjacent primes."<<endl;
}
else {
cout<<minl<<","<<minr<<" are closest, "<<maxl<<","<<maxr<<" are most distant."<<endl;
}
return 0;
}