• 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]);
        }
    }
    
  • 相关阅读:
    失落的情
    我有个想法------彩南书屋
    西藏旅游闲记(上)
    夜归
    宝石山再记
    学车的日子(一)
    BootStrapValidator表单验证插件的学习和使用
    shard_row_id_bits & pre_split_regions
    某某大肠_tikv_修改配置参数
    第十二周总结
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798940.html
Copyright © 2020-2023  润新知