CSU1030 素数槽
处于相邻的两个素数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 492170Sample Output
4 0 6 0 114
筛一发素数,然后二分一下范围就行。。。
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> #include <map> #include <set> #include <vector> #include <queue> #include <cmath> #include <cctype> using namespace std; const int N = 2000000; int prime[N], p, vis[N], n, k; int main() { vis[1] = 1; for(int i = 2 ; i < N ; i ++) { if(!vis[i]) prime[p ++] = i; for(int j = 0 ; j < p ; j ++) { if(i * prime[j] >= N) break; vis[i * prime[j]] = 1; if(i % prime[j] == 0) break; } } scanf("%d", &n); for(int i = 1 ; i <= n ; i ++) { scanf("%d", &k); if(*lower_bound(prime, prime + p, k) == k) puts("0"); else { int r = *lower_bound(prime, prime + p, k); if(prime[0] > k) { printf("%d\n", r); } else { int l = *(lower_bound(prime, prime + p, k) - 1); printf("%d\n", r - l); } } } }