POJ Prime Gap
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 6841 | Accepted: 3946 |
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 492170 0
Sample Output
4 0 6 0 114
Source
1 #include<stdio.h> 2 typedef __int64 LL ; 3 int f[1300000] , prime[100010],count = 0 ; 4 void getPrime(){ 5 for(int i=2;i<=1299709;i++) 6 if(!f[i]){ 7 prime[count++] = i; 8 for(LL j=(LL)i*i;j<=1299709;j+=i) 9 f[j] = 1 ; 10 } 11 } 12 int BinarySearch(int n){ 13 int left = 0,right = count-1, mid ; 14 mid = (left + right) >> 1; 15 while( (prime[mid-1] < n && prime[mid] < n )|| (prime[mid-1] > n) && prime[mid] > n){ 16 if(prime[mid] < n) 17 left = mid ; 18 else 19 right = mid ; 20 mid = (left + right) >> 1; 21 } 22 return (prime[mid] - prime[mid-1]); 23 } 24 int main(){ 25 getPrime(); 26 int n; 27 while(scanf("%d",&n) && n ){ 28 if(f[n] == 0) 29 printf("%d\n",0) ; 30 else 31 printf("%d\n",BinarySearch(n)) ; 32 } 33 return 0; 34 }