素数槽
Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu
Description
处于相邻的两个素数p和p + n之间的n - 1个连续的合数所组成的序列我们将其称为长度为n的素数槽。例如,‹24, 25, 26, 27, 28›是处于素数23和素数29之间的一个长度为6的素数槽。
你的任务就是写一个程序来计算包含整数k的素数槽的长度。如果k本身就是素数,那么认为包含k的素数槽的长度为0。
Input
第一行是一个数字n,表示需要测试的数据的个数。后面有n行,每行是一个正整数k,k大于1并且小于或等于的第十万个素数(也就是1299709)。
Output
对于输入部分输入的每一个k,都对应输出一个非负整数,表示包含k的素数槽的长度,每个非负整数占一行。
Sample Input
5
10
11
27
2
492170
Sample Output
4
0
6
0
114
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define MAXN 1299709 int prime[MAXN]; bool visit[MAXN]; int is_prime() { memset(visit, true, sizeof(visit)); int num = 0; for (int i = 2; i <= MAXN; ++i) { if (visit[i] == true) prime[num++] = i; for (int j = 0; ((j < num) && (i * prime[j] <= MAXN)); ++j) { visit[i * prime[j]] = false; if (i % prime[j] == 0) break; } } return num; } int Bsearch(int s,int t,int x) { int p=0,flag=1; if(s<=t) { int mid=(s+t)/2; if(x<prime[mid]) Bsearch(s,mid-1,x); else if(x==prime[mid]) {flag=0;return p;} else Bsearch(mid+1,t,x); } else if(flag==1) return (prime[s]-prime[t]); } int main() { int n,m,sum; scanf("%d",&n); sum=is_prime(); while(n--) { scanf("%d",&m); cout<<Bsearch(0,sum-1,m)<<endl; } return 0; }