zoukankan      html  css  js  c++  java
  • POJ 2689 Prime Distance(素数筛选)

    题意:输入区间[l,u],其中l和u为int范围的整数,区间最大为1000000。求出[l,u]中,相邻素数只差最大和最小的素数对。当存在多个时,输出较小的素数对。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define ll long long
    using namespace std;
    
    const int maxm=1e6+10;
    const int maxn=1e5+100;
    int prime[maxn];
    bool vis[maxn];
    int a,b;
    int tot=0;
    
    void is_prime()
    {
        memset(prime,0,sizeof(prime));
        for(int i=2;i<=maxn;i++)
        {
            if(!prime[i]) prime[++prime[0]]=i;
            for(ll j=1;j<=prime[0]&&prime[j]<=maxn/i;j++)
            {
                prime[i*prime[j]]=1;
                if(i%prime[j]==0) break;
            }
        }
    }
    
    bool notprime[maxm];
    int prime2[maxm];
    
    void is_prime2(int L,int R)
    {
        memset(notprime,false,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()
    {
        is_prime();
        while(~scanf("%d%d",&a,&b)){
            is_prime2(a,b);
            if(prime2[0]<2) printf("There are no adjacent primes.
    ");
            else{
                int x1=0,x2=100000000,y1=0,y2=0;
                for(int j=1;j<prime2[0];j++)
                {
                    if(prime2[j+1]-prime2[j]<x2-x1)
                    {
                        x1=prime2[j];
                        x2=prime2[j+1];
                    }
                    if(prime2[j+1]-prime2[j]>y2-y1)
                    {
                        y1=prime2[j];
                        y2=prime2[j+1];
                    }
                }
                printf("%d,%d are closest, %d,%d are most distant.
    ",x1,x2,y1,y2);
            }
        }
        return 0;
    }
  • 相关阅读:
    待学习资料
    Hive之数据类型
    Hive 之元数据库的三种模式
    Hive之数据模型
    311 jvm类加载以及对象回收相关
    221 netty模型相关
    J101
    213 NIO编程
    XXLJOB终止定时任务的犯二小故事
    XXL-JOB源码研究(1)---version 2.1.2
  • 原文地址:https://www.cnblogs.com/Fy1999/p/9775472.html
Copyright © 2011-2022 走看看