zoukankan      html  css  js  c++  java
  • UVA10140 Prime Distance

    题意翻译

    大致意思:给定两个整数L,R(1<=L<=R<=2147483648,R-L<=1000000),求闭区间 [L,R]中相邻两个质数的差的最小值和最大值是多少,分别输出这两个质数。

    【输入格式】

    输入有若干行,每行两个整数 L,R

    【输出格式】

    对于每个L,R输出最小值和最大值,格式参照样例。若区间内无质数,输出"There are no adjacent primes."。

    分割线

    看到这题,瞄一眼数据范围,噫,2的31次方,比int范围大了1,然后看到了下一句,咦?R-L好小,只有一百万,所以,我们从这方面入手。

    首先,先把2到根号R中的质数筛出来,根号R很小,不超过五万,此为预处理,L到R中的质数其实只要到根号R,因为大于根号R的质数要么是一个小质数乘一个大质数,而先前因为小质数已经将这种的筛掉了,要么是大质数乘大质数,已经超过了R,不在处理范围,然而小质数乘小质数也不超过根号R(此处小质数指小于根号R的质数,大质数指大于根号R的质数)。

    然后我注意到了是多组数据,所以开头的一堆附初值是少不了的,切记不要忘掉!

    之后,枚举一个质数,找到它的第一个倍数(在L到R区间内),和最后一个倍数,在此区间内枚举,删掉质数的倍数,再扫一遍得到一个质数表。

    最后,就是相邻质数之差选一个最小和最大,这好办,枚举一个i,和i+1做差即可。

    数学题哭唧唧qwq

    代码如下:(注意开longlong,有乘法的时候要乘1ll,把它暂时变为longlong类型其实全开longlong了乘不乘也没什么关系>_>

    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    #define M 1000010
    using namespace std;
    ll l,r,flag,cnt,cnt1,cnt2,ans1,ans2,ans3,ans4,vis[M],a[M],b[M],c[M],c2[M],c3[M],minn,maxx;
    int main()
    {
        for(ll i=2;i<=50000;i++)
        {
            if(vis[i]==0)
            {
                a[++cnt]=i;
                for(ll j=i+i;j<=50000;j+=i)
                {
                    vis[j]=1;
                }
            }
        }
        while(scanf("%lld%lld",&l,&r)!=EOF)
        {
            flag=0;
            memset(vis,0,sizeof(vis));
            for(ll i=1;i<=cnt;i++)
            {
                for(ll j=l/a[i];j<=r/a[i];j++)//得到l到r区间的a[i]的倍数
                {
                    if(1ll*a[i]*j-l<0)continue;
                    if(j>1)vis[1ll*a[i]*j-l]=1;//我们不能删除这个质数本身,也就是1倍的a[i],大于等于2以上的倍数才能删掉,这里特判
                }
            }
            cnt1=cnt2=0;
            if(l==1)vis[0]=1;
            for(ll i=l;i<=r;i++)
            {
                if(vis[i-l]==0)b[++cnt1]=i,flag++;
            }
            if(flag<=1){printf("There are no adjacent primes.
    ");}
            else if(flag>1)
            {
                for(ll i=1;i<=cnt1-1;i++)
                {
                    c[++cnt2]=b[i+1]-b[i];
                    c2[cnt2]=b[i];
                    c3[cnt2]=b[i+1];
                }
                minn=1e18;
                maxx=0;
                for(ll i=1;i<=cnt2;i++)
                {
                    if(minn>c[i]){minn=c[i];ans1=c2[i];ans2=c3[i];}
                    if(maxx<c[i]){maxx=c[i];ans3=c2[i];ans4=c3[i];}
                }
                printf("%lld,%lld are closest, %lld,%lld are most distant.
    ",ans1,ans2,ans3,ans4);
            }
        }
        return 0;
    }

    end.谢谢阅读

  • 相关阅读:
    PAT1124:Raffle for Weibo Followers
    Pat1071: Speech Patterns
    PAT1032: Sharing (25)
    Pat1128:N Queens Puzzle
    C++相关:C++的IO库
    Pat1108: Finding Average
    PAT1070:Mooncake
    乐港游戏校招面试总结
    并发编程005 --- future &&futureTask
    并发编程004 --- 线程池的使用
  • 原文地址:https://www.cnblogs.com/lcccAngelo/p/9988993.html
Copyright © 2011-2022 走看看