zoukankan      html  css  js  c++  java
  • 解题报告: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;
    }
    

      

  • 相关阅读:
    485串口接线
    mvc3 升级mvc5
    VB连接ACCESS数据库,使用 LIKE 通配符问题
    VB6 读写西门子PLC
    可用的 .net core 支持 RSA 私钥加密工具类
    解决 Win7 远程桌面 已停止工作的问题
    解决 WinForm 重写 CreateParams 隐藏窗口以后的显示问题
    解决安装 .net framework 发生 extracting files error 问题
    CentOS7 安装配置笔记
    通过特殊处理 Resize 事件解决 WinForm 加载时闪烁问题的一个方法
  • 原文地址:https://www.cnblogs.com/pprp/p/7623454.html
Copyright © 2011-2022 走看看