素数距离问题
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0-
输入
-
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),
输出
-
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
样例输入
-
3 6 8 10
样例输出
-
5 1 7 1 11 1
-
第一行给出测试数据组数N(0<N<=10000)
先利用素数筛法打表,然后进行判断。注意边界条件
#include <cstdio>
#define MAX 1000010
int prime[MAX];
int table[MAX];
long long primeTable() {
long long n = 0;
table[0] = 1;
table[1] = 1;
for( long long i = 2; i < MAX; i++ ) {
if( table[i] == 1 )
continue;
prime[n++] = i;
for( long long j = 2 * i; j < MAX; j += i ) {
table[j] = 1;
}
}
return n;
}
void findMinDist( long long n, long long size ) {
long long ans;
long long dist = 0;
if( table[n] == 0 ) {
ans = n;
dist = 0;
}
else {
long long up = n;
long long down = n;
while( table[up] != 0 ) {
up++;
}
while( table[down] != 0 && down > 0 ) {
down--;
}
if( down == 0 ) {
ans = up;
dist = up - n;
}
else if( ( up - n ) < ( n - down ) ) {
ans = up;
dist = up - n;
}
else {
ans = down;
dist = n - down;
}
}
printf( "%lld %lld\n", ans, dist );
}
int main() {
long long size = primeTable();
long long n;
scanf( "%lld", &n );
long long num;
for( long long i = 0; i < n; i++ ) {
scanf( "%lld", &num );
findMinDist( num, size );
}
return 0;
}