素数距离 - 计蒜客

蒜头君请你求出区间 [ l , r ] [l,r] 上距离最近的相邻的素数对和距离最远的相邻的素数对。

3 , 5 3,5 是相邻的素数, 2 , 5 2, 5 不是相邻的素数。距离定义为 2 2 个素数的差的绝对值。比如5,7 距离为 2

输入格式

输入 2 2 个整数 l , r ( 1 l r 8000000 ) l, r(1 \le l \le r \le 8000000)

输出格式

如果 a , b ( a b ) a, b(ab) 是距离最近的素数对, c , d ( c d ) c,d(cd) 是距离最远的素数对,按照如下格式输出a,b are closest, c,d are most distant.

如果最近或者最远有多对,输出 a a c c​ 最小的。如果没有相邻是素数对,输出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个变量,距离最大最小的左右值以及他们的距离。
选找前,先用向量 v e c t o r vector 储存每个数,下标表示数,保存元素0、1表示是否为素数。
再用优化方法,筛选素数。
(筛选方法地址:质素筛选
利用变量 t e m p temp 来保存前一个质数。
代码:

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_43508196/article/details/86707672
今日推荐