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);
}
}
}
}

浙公网安备 33010602011771号