zhber
有好多做过的题没写下来,如果我还能记得就补吧

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
492170
0

Sample Output

4
0
6
0
114

给个x,如果x夹在两个质数a,b之间,求b-a,否则输出0

在筛法的时候预处理下距离就好

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #define LL long long
 5 using namespace std;
 6 inline LL read()
 7 {
 8     LL x=0,f=1;char ch=getchar();
 9     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
10     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
11     return x*f;
12 }
13 LL n;
14 bool mk[2000010];
15 int p[2000010],len;
16 int ans[2000010];
17 inline LL LLabs(LL a){return a<0?-a:a;}
18 inline void getp()
19 {
20     memset(ans,-1,sizeof(ans));
21     for (int i=2;i<=2000000;i++)
22     {
23         if (!mk[i])
24         {
25             p[++len]=i;
26             ans[i]=0;
27             for (int j=2*i;j<=2000000;j+=i)mk[j]=1;
28         }else ans[i]=ans[i-1]+1;
29     }
30     for (int i=2000000;i>=1;i--)
31     {
32         if (!ans[i])continue;
33         ans[i]=max(ans[i],ans[i+1]);
34     }
35 }
36 int main()
37 {
38     getp();
39     ans[1]=-1;
40     while (~scanf("%lld",&n)&&n)printf("%d\n",ans[n]?ans[n]+1:0);
41 }
poj 3518

 

posted on 2017-08-04 15:24  zhber  阅读(146)  评论(0编辑  收藏  举报