• 解题报告:poj2689 Prime Distance


    2017-10-03 11:29:20

    writer:pprp

    来源:kuangbin模板

    从已经筛选好的素数中筛选出规定区间的素数

    /*
    *prime DIstance
    *给出一个区间[L,U],找到相邻的距离最近的两个素数的和
    *还有距离最远的两个素数
    *1 <= L < U <= 2147483647
    *区间长度不超过1000000
    *就是要筛选出[L,U]之间的素数
    */
    
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    const int MAXN = 100010;
    int prime[MAXN+1];
    
    //找到所有的素数
    void getprime()
    {
        memset(prime,0,sizeof(prime));
        for(int i = 2; i <= MAXN ; i++)
        {
            if(!prime[i])
                prime[++prime[0]] = i;
            for(int j = 1 ; j <= prime[0]&&prime[j] <= MAXN/i; j++)
            {
                prime[prime[j]*i] = 1;
                if(i%prime[j] == 0)
                    break;
            }
        }
    }
    bool notprime[1000010];
    int prime2[1000010];
    
    //找到指定区间内的素数存放到prime2数组中
    void getprime2(int L, int R)
    {
        memset(notprime,0,sizeof(notprime));
        if(L < 2)
            L = 2;
        for(int i = 1; i < prime[0]&&(long long)prime[i]*prime[i] <= R; i++)
        {
            int S = L/prime[i] + (L%prime[i] > 0);
            if(S == 1)
                S = 2;
            for(int j = S; (long long)j * prime[i]<= R; j++)
            {
                if((long long)j * prime[i] >= L)
                    notprime[j*prime[i]-L] = true;
            }
        }
        prime2[0] = 0;
        for(int i = 0 ; i <= R-L; i++)
        {
            if(!notprime[i])
                prime2[++prime2[0]] = i + L;
        }
    }
    int main()
    {
         getprime();
         int L, U;
         while(scanf("%d%d",&L,&U) == 2)
         {
             getprime2(L,U);
    
             if(prime2[0] < 2)
                printf("There are no adjacent primes.
    ");
             else
             {
                 int x1 = 0, x2 = 100000000, y1 = 0, y2 = 0;
                 for(int i = 1 ; i < prime2[0]; i++)
                 {
                     if(prime2[i+1]-prime2[i] < x2-x1)//找到距离最近的点
                     {
                         x1 = prime2[i];
                         x2 = prime2[i+1];
                     }
                     if(prime2[i+1]-prime2[i]>y2-y1)//找到距离最远的点
                     {
                         y1 = prime2[i];
                         y2 = prime2[i+1];
                     }
                 }
                 printf("%d,%d are closest, %d,%d are most distant.
    ",x1,x2,y1,y2);
             }
         }
        return 0;
    }
    

      

  • 相关阅读:
    [bzoj3999] [TJOI2015]旅游
    [bzoj3143] [HNOI2013]游走
    [bzoj3140] [Hnoi2013]消毒
    [bzoj3142] [HNOI2013]数列
    [bzoj4860] [BeiJing2017]树的难题
    [bzoj2599] [IOI2011]Race
    [bzoj1558] [JSOI2009]等差数列
    [bzoj3626] [LNOI2014]LCA
    [bzoj4011] [HNOI2015]落忆枫音
    JQuery
  • 原文地址:https://www.cnblogs.com/pprp/p/7623454.html
Copyright © 2020-2023  润新知