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 ",ans[n]?ans[n]+1:0); 41 }