Prime Gap

来源:互联网 发布:手机淘宝购买成功截图 编辑:程序博客网 时间:2024/06/06 02:27

Prime Gap

Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 40   Accepted Submission(s) : 31
Problem 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 + nis 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
<p>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.</p>
 

Output
<p>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.</p>
 

Sample Input
10112724921700
 

Sample Output
4060114
题意:给一个n 是素数直接输出0
不是素数则输出比他大的最小的素数与比他小的最大的素数的差
思路:筛素数
之前有简单看过欧拉筛法和埃拉托斯特拉筛法
埃拉托斯特拉筛法就是找到第一个新素数然后将其倍数全部筛掉,做很多无用功,但是足够了
欧拉筛法的时间复杂度更小 具体问度娘
int Eratosthenes (int n){          int i, j, k;          phi[1] = 1;          for (i = 2; i < n; ++i){                  if (!vis[i]) p[cnt++] = i;                  for (j = i; j < n; j += i) {                          if (!phi[j]) phi[j] = j;                          phi[j] = phi[j] / i * (i - 1);                          vis[j] = true;                  }          }          return cnt;  }  
  • Source Code
    #include<iostream>#include<stdio.h>#include<string.h>using namespace std;int p[1299709+10];void find(){    int i,j;    for(i=2;i<1299709+10;i++)    {        if(!p[i])        {            for(j=i+i;j<1299709+10;j+=i)            {                p[j]=1;                }            }    }    }int judge(int x){    for(int i=2;i<x;i++)    {        if(x%i==0)        return 0;        }    return 1;    }int main(){    find();    int i,j;    //cout<<judge(11)<<endl;    //for(i=1;i<20;i++)    //cout<<i<<" "<<p[i]<<endl;    int n;    int num1,num2;    while(cin>>n)    {        if(n==0)break;        if(p[n]==0)        cout<<0<<endl;        else        {            for(i=n;i<1299709+10;i++)            {                if(p[i]==0)                {                    num1=i;                    break;                    }                }            for(i=n;i>=1;i--)            {                if(p[i]==0)                {                    num2=i;                    break;                    }                }            cout<<num1-num2<<endl;            }        }    return 0;    }