美文网首页
Ox31质数

Ox31质数

作者: burningrain | 来源:发表于2021-02-01 09:41 被阅读0次

    给定两个整数LU,你需要在闭区间[L,U]内找到距离最接近的两个相邻质数C1C2(即C2-C1是最小的),如果存在相同距离的其他相邻质数对,则输出第一对。

    同时,你还需要找到距离最远的两个相邻质数D1D2(即D1-D2是最大的),如果存在相同距离的其他相邻质数对,则输出第一对。

    输入格式
    每行输入两个整数LU,其中LU的差值不会超过1000000

    输出格式
    对于每个LU ,输出一个结果,结果占一行。

    结果包括距离最近的相邻质数对和距离最远的相邻质数对。(具体格式参照样例)

    如果L和U之间不存在质数对,则输出“There are no adjacent primes.”。

    数据范围
    1≤L<U≤231−1
    输入样例:

    2 17
    14 17

    输出样例:

    2,3 are closest, 7,11 are most distant.
    There are no adjacent primes.

    代码:

    #include<bits/stdc++.h>
    #include<math.h>
    using namespace std;
    typedef long long ll;
    const ll MAX_N=1e6+5;
    ll v[MAX_N],prime[MAX_N];
    ll vis[MAX_N],primes[MAX_N];
    ll m;
    void Prime(ll n){
        memset(v,0,sizeof(v));//最小质因子
        m=0;//质数数量
        for(ll i=2;i<=n;i++){
            if(v[i]==0){//i是质数
                v[i]=i;
                prime[++m]=i;
            }
            for(ll j=1;j<=m;j++){
                //i有比prime[j]更小的质因子,或者超出n的范围
                if(prime[j]>v[i]||prime[j]>n/i) break;
                v[i*prime[j]]=prime[j];
            }
        }
    }
    int main(){
        ll L,U;
        while(cin>>L>>U){
            ll n = sqrt(U)+1;
            Prime(n);
            memset(vis,0,sizeof(vis));
            memset(primes,0,sizeof(primes));
            for(ll i=1;i<=m;i++){
                ll p = prime[i];
    //            if(L<p) break;
                // 把[L,U]之间P的倍数删掉
                ll x = ceil(L/p)*p;
                ll y = max(x,2*p);
                for(ll j=y;j<=U;j+=p){
                    vis[j-L]=true;
                }
            }
            ll cnt=0;
            for(ll i=0;i<=U-L;i++){
                if(!vis[i]&&i+L>1){
                    primes[++cnt]=L+i;
                }
            }
            if(cnt<2){
                cout<<"There are no adjacent primes."<<endl;
                continue;
            }
            ll minn=1,maxx=1;
            for(ll i=1;i+1<=cnt;i++){
                ll d = primes[i+1]-primes[i];
                if(primes[minn+1]-primes[minn]>d) minn=i;
                if(primes[maxx+1]-primes[maxx]<d) maxx=i;
            }
            cout<<primes[minn]<<","<<primes[minn+1]<<" are closest, "<<primes[maxx]<<","<<primes[maxx+1]<<" are most distant."<<endl;
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:Ox31质数

          本文链接:https://www.haomeiwen.com/subject/qchjtltx.html