• poj2689 Prime Distance(素数区间筛法)


    题目链接:http://poj.org/problem?id=2689

    题目大意:输入两个数L和U(1<=L<U<=2 147 483 647),要找出两个相邻素数C1和C2(L<=C1<C2<=U)是距离最小的,如果相邻素数不止一对,选择最初的,还要找出两个相邻的素数D1,和D2是距离最大的(同样在有多对的情况下选择最初的)

    其中L<U,L和U的差不超过1 000 000

    输入样例:

    2 17
    14 17

    输出样例:

    2,3 are closest, 7,11 are most distant.
    There are no adjacent primes.

    解题思路:需要求出给定范围内区间所有的素数,然后再把素数间的最大距离、最小距离求出来。所以我们首先得用筛法筛出区间[L,U]范围内的素数。

    因为数据区间超过的上界打到21亿,不能将所有小于21亿的素数存下来,不过我们发现区间的长度不超过1 000 000,使用筛法筛掉[L,U]区间的所有非素数,需要知道[L,U]区间的所有非素数的素数因子(因为一个非素数是被它最小的素因子筛掉)。2 147 483 647内的数或者是素数,能被根号2 147 483 647内的素数整除,也就是说,[L,U]区间的所有非素数的素数因子都在根号2 147 483 647内。

    可以预先将根号2 147 483 647内的所有素数找出来,然后用这些素数去筛掉指定区间的所有非素数

    代码:

    #include<iostream>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int maxn=50005;
    int prime[maxn];
    int l,u,tot=0;
    bool isprime[1000005];
    void getprime(int N){
        memset(prime,0,sizeof(prime));
        for(int i=2;i<=N;i++){
            if(!prime[i])
                prime[tot++]=i;
            for(int j=0;j<tot&&prime[j]*i<=N;j++){
                prime[i*prime[j]]=1;
                if(i%prime[j]==0) break;
            }
        }
    }
    int main(){
        getprime(50002);
        while(cin>>l>>u){
            memset(isprime,true,sizeof(isprime));
            for(int i=0;i<tot;i++){
                int a=(l-1)/prime[i]+1,b=u/prime[i];
                for(int j=a;j<=b;j++)if(j>1) isprime[j*prime[i]-l]=0;
            }
            if(l==1) isprime[0]=0; //注意特判l=1的情况 
            int pos=-1,l1,r1,l2,r2,maxdis=0,mindis=0x3f3f3f3f;
            for(int i=0;i<=u-l;i++){
                if(isprime[i]){
                    if(pos==-1) {
                        pos=i;
                        continue;
                    }
                    if(i-pos<mindis){
                        l1=l+pos;
                        r1=l+i;
                        mindis=i-pos;
                    }
                    if(i-pos>maxdis){
                        maxdis=i-pos;
                        l2=l+pos;
                        r2=l+i;
                    }
                    pos=i;
                }
            }
            if(maxdis==0) printf("There are no adjacent primes.
    ");
            else printf("%d,%d are closest, %d,%d are most distant.
    ",l1,r1,l2,r2);
        }
        return 0;
    }
  • 相关阅读:
    JDBC进行Oracle数据库操作。
    java数据库编程:使用元数据分析数据库
    Java事务处理总结
    TCP、UDP数据包大小的限制
    Java SWT编程基础
    Win7窗口最大化和最小化快捷键
    CentOS7 yum 安装mysql 5.6
    mybatis简介
    mybatis中mysql和oracle的差异
    Java 11 将至,不妨了解一下 Oracle JDK 之外的版本
  • 原文地址:https://www.cnblogs.com/zjl192628928/p/11158473.html
Copyright © 2020-2023  润新知