zoukankan      html  css  js  c++  java
  • POJ 3581 Prime Gap(二分)

    Prime Gap
    Time Limit: 5000MS Memory Limit: 65536K
    Total Submissions: 11009 Accepted: 6298
    Description
    The sequence of n − 1 consecutive composite numbers (positive integers that are not prime and not equal to 1) lying between two successive prime numbers p and p + n is called a prime gap of length n. For example, ‹24, 25, 26, 27, 28› between 23 and 29 is a prime gap of length 6.
    Your mission is to write a program to calculate, for a given positive integer k, the length of the prime gap that contains k. For convenience, the length is considered 0 in case no prime gap contains k.
    Input
    The input is a sequence of lines each of which contains a single positive integer. Each positive integer is greater than 1 and less than or equal to the 100000th prime number, which is 1299709. The end of the input is indicated by a line containing a single zero.
    Output
    The output should be composed of lines each of which contains a single non-negative integer. It is the length of the prime gap that contains the corresponding positive integer in the input if it is a composite number, or 0 otherwise. No other characters should occur in the output.
    Sample Input
    10 11 27 2 4921700
    Sample Output
    4 0 6 0 114
    Source Japan 2007

    二分,稍微需要处理一点细节。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int MAXN=1e7-100;
    int prime[MAXN];
    bool pri[MAXN+10];
    int sieve(int n)
    {
        int p=0;
        for(int i=0; i<=n; i++)
            pri[i]=true;
        pri[0]=pri[1]=false;
        for(int i=2; i<=n; i++)
        {
            if(pri[i])
            {
                prime[++p]=i;
                for(int j=2*i;j<=n;j+=i)
                    pri[j]=false;
            }
        }
        return p;
    }
    int main()
    {
        int m=sieve(1e7-100);
        int t;
        while(~scanf("%d",&t)&&t){
            int up=m;
         //   cout<<prime[m];
            int lo=0;
            while(1){
                int tem=(up+lo)/2;
                if(prime[tem]>t) up=tem;
                else if(prime[tem]==t){
                    up=lo=0;
                    break;
                }
                else lo=tem;
                if(lo+1==up)break;
            }
           printf("%d
    ",prime[up]-prime[lo]);
        }
    }
    
  • 相关阅读:
    video 属性和事件用法大全
    微信小程序 组件通信相关知识整理
    JavaScript实现登录窗口的拖拽
    JS 各种宽高
    CSS3 Animation
    CSS3 Transition
    CSS3 Transform
    vue 回到页面顶部
    element-ui 动态换肤
    Chrome浏览器下自动填充的输入框背景
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798939.html
Copyright © 2011-2022 走看看