计蒜客练习题:素数距离

计蒜客练习题:素数距离

解题思路:遍历一遍is_prim数组 存储[l,r]区间上是质数的数和质数总数(存储素数表);遍历一遍素数表数组 更新最大值 最小值机器对应的变量,最后打印即可。

AC代码:

    #include<iostream>
#include<cstdio> 
using namespace std;

int n;

int is_prime[8000010];
int primeArr[8000010];
//素数筛选法 
int prime(int l,int r){
	for (int i = 2; i <= r; ++i) {
        is_prime[i] = 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;
        	}
     	}
	}
}

int main(){
	int l,r;
	cin>>l>>r;
	prime(l,r);
	//遍历一遍is_prim数组 存储[l,r]区间上是质数的数和质数总数
	//遍历一遍数组 更新最大值 最小值机器对应的变量,最后打印即可 
	int k = 0;
	for(int i=l;i<=r;i++){
		if(is_prime[i]){
			primeArr[k++] = i;
		}
	}
//	//现在k表示区间上的素数总数
	if(k<2){
		cout<<"There are no adjacent primes."<<endl;
		return 0;
	}
	int mind = 0x3f3f3f3f;
	int maxd = -0x3f3f3f3f;
	int d1,d2;
	for(int i=0;i<k-1;i++){
		int t = primeArr[i+1] - primeArr[i];
		if(t < mind){
			mind = t;
			d1 = i;
		}
		if(t > maxd){
			maxd = t;
			d2 = i;
		}
	}
	printf("%d,%d are closest, %d,%d are most distant.\n",primeArr[d1],primeArr[d1+1],primeArr[d2],primeArr[d2+1]);
	return 0;
}
posted @ 2018-11-20 21:43  fishers  阅读(340)  评论(0编辑  收藏  举报