计蒜客习题:素数距离


问题描述

蒜头君请你求出区间 [l,r] 上距离最近的相邻的素数对和距离最远的相邻的素数对。3,5 是相邻的素数,2,5 不是相邻的素数。距离定义为 2 个素数的差的绝对值。比如 5,7 距离为 2。
输入格式
输入 2 个整数l,r(1≤l≤r≤8000000)
输出格式
如果 a,b(a< b) 是距离最近的素数对,c,d(c< d) 是距离最远的素数对,按照如下格式输出a,b are closest, c,d are most distant. 。如果最近或者最远有多对,输出 a 和 c 最小的。如果没有相邻是素数对,输出There are no adjacent primes.。
样例输入
3 10
样例输出
3,5 are closest, 3,5 are most distant.


AC代码

#include 
#include 
#include 
using namespace std;
int p[8000100];
int main()
{
    int l,r;
    cin>>l>>r;
    for(int i=2;i<=r;i++)
    {
        p[i]=1;
    }
    for(int i=2;i*i<=r;i++)
    {
        if(p[i]==1)
        {
            for(int j=i*i;j<=r;j+=i)
            {
                p[j]=0;
            }
        }
    }
    int a,b;
    a=-1;
    b=-1;
    int cnt=0;
    for(int i=l;i<=r;i++)
    {
        if(cnt==0&&p[i]==1){
            a=i;
            cnt++;
        }
        else if((cnt==1)&&(p[i]==1)){
        b=i;
        break;
        }
    }
    if(a==-1||b==-1){
        cout<<"There are no adjacent primes.";
        return 0;
    }
    int d1,d2,c1,c2;
    d1=a;d2=b;c1=a;c2=b;
    for(int i=b;i<=r;i++)
    {
        if(p[i]==1){
            for(int j=i+1;j<=r;j++)
            {
                if(p[j]==1&&j-iif(p[j]==1&&j-i>c2-c1){
                    c1=i;c2=j;
                }
                if(p[j]==1)break;
            }
        }
    }
    cout<","<" are closest, "<","<" are most distant.";
    return 0;
}

你可能感兴趣的:(算法竞赛刷题,#,数论,计蒜客NOIP习题)