zoukankan      html  css  js  c++  java
  • poj2689 Prime Distance(质数)

    poj

    题意:给定整数L,R((1<=L,R<=2^{31},R-L<=10^6)),求闭区间[L,R]中相邻两个质数的差最大和最小分别是多少,输出这两对质数.

    分析:注意到R-L的取值范围是我们能够接受的范围,想办法筛去[L,R]中所有合数.考虑先求出2~(sqrt R)内的所有质数,对于每个质数p,把[L,R]中能被p整除的数标记.最后没有被标记的数就是质数,然后只要枚举比较就行了.

    然后还有一个小技巧就是把[L,R]移到[0,R-L]中来,不然数组接受不了.

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int a[1000001],b[1000001],v[1000001];
    int n,m,l,r,minn,maxn;
    int x,y,xx,yy;
    void prime(){
        memset(v,1,sizeof(v));
        for(int i=2;i<=46340;i++)
            if(v[i]){
                a[++n]=i;
                for(int j=2;j<=46340/i;j++)
    				v[i*j]=0;
            }
    }
    int main(){
        prime();
        while(cin>>l>>r){
            memset(v,1,sizeof(v));
            if(l==1)v[0]=0;
            for(int i=1;i<=n;i++)
    	    for(int j=l/a[i];j<=r/a[i];j++){
            	if(a[i]*j-l<0)continue;
    			if(j>1)v[a[i]*j-l]=0;
    	    }
            m=0;
            for(int i=l;i<=r;i++){
                if(v[i-l])b[++m]=i;
                if(i==r)break;
            }
            minn=2147483647;maxn=0;
            for(int i=1;i<m;i++){
                int j=b[i+1]-b[i];
                if(j<minn){minn=j;x=b[i];y=b[i+1];}
                if(j>maxn){maxn=j;xx=b[i];yy=b[i+1];}
            }
            if(!maxn) cout<<"There are no adjacent primes."<<endl;
            else cout<<x<<","<<y<<" are closest, "<<xx<<","<<yy<<" are most distant."<<endl ;
        }
        return 0;
    }
    
    
  • 相关阅读:
    zabbix
    Tomcat 部署Web应用
    WebLogic
    WebLogic部署集群和代理服务器
    WebLogic 中的基本概念
    GIT详解和GITHUB
    Tomcat 内存溢出对应解决方式
    apache和tomcat区别
    数据库介绍
    The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
  • 原文地址:https://www.cnblogs.com/PPXppx/p/10500456.html
Copyright © 2011-2022 走看看