质数距离

基本题意

给定两个整数L和R,你需要在闭区间[L,R]内找到距离最接近的两个相邻质数C1和C2(即C2-C1是最小的),如果存在相同距离的其他相邻质数对,则输出第一对。
同时,你还需要找到距离最远的两个相邻质数D1和D2(即D1-D2是最大的),如果存在相同距离的其他相邻质数对,则输出第一对。 输入格式
每行输入两个整数L和R,其中L和R的差值不会超过1000000。
输出格式
对于每个L和R ,输出一个结果,结果占一行。
结果包括距离最近的相邻质数对和距离最远的相邻质数对。(具体格式参照样例)
如果L和R之间不存在质数对,则输出“There are no adjacent primes.”。
数据范围
1≤L<R≤2^31−1
输入样例:
2 17
14 17
输出样例:
2,3 are closest, 7,11 are most distant.
There are no adjacent primes.

基本思路

1.此题必然要筛素数,考虑用效率较高的欧拉筛。
2.L与R范围很大,不可能将[2,R]内的素数全部筛出。但我们注意到R-L的值很小,所以考虑一种算法,只生成[L,R]内的素数

数学算法与证明

1.筛出[2,sqrt( R )]中所有的素数
2.根据每个合数必定包含一个不大于sqrt(N)的质因子,对于每个质数p,把i*p([L/p]<=i<=[R/p])标记为合数
3.剩下的即为所求质数

代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1000005;
int prime[N],cnt;
bool st[N];
typedef long long ll;
void get(int n){
    
    //欧拉筛代码
    memset(st,false,sizeof st);
    cnt=0;
    for(int i=2;i<=n;i++){
    
    
        if(!st[i]) prime[cnt++]=i;
        for(int j=0;prime[j]*i<=n;j++){
    
    
            st[prime[j]*i]=true;
            if(i%prime[j]==0) break;
        }
    }
}
int main(){
    
    
    ll l,r;
    while(cin>>l>>r){
    
    
        get(50000);
        memset(st,false,sizeof st);
        for(int i=0;i<cnt;i++){
    
    
            int p=prime[i];
            for(ll j=max((l+p-1)/p*p,2ll*p);j<=r;j+=p){
    
    //求比l大的最小的p的倍数,即ceil(l/p)*p。而通常将ceil(a/b)写成floor((a+b-1)/b)。
                st[j-l]=true;//坐标偏移,类似离散化
            }
        }
        cnt=0;
        for(int i=0;i<=r-l;i++){
    
    
            if(!st[i] && i+l>1) prime[cnt++]=i+l;//要特判1的情况
        }
        if(cnt<2) puts("There are no adjacent primes.");
        else{
    
    
            int maxp=0,minp=0;
            for(int i=0;i+1<cnt;i++){
    
    
                int d=prime[i+1]-prime[i];
                if(d<prime[minp+1]-prime[minp]) minp=i;
                if(d>prime[maxp+1]-prime[maxp]) maxp=i;
            }
            printf("%d,%d are closest, %d,%d are most distant.\n",prime[minp],prime[minp+1],prime[maxp],prime[maxp+1]);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_55341679/article/details/114155066