素数距离问题
时间限制: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
#include<cstdio>
#include<cmath>
int abs(int a, int b)
{
if (a > b) return a - b;
return b - a;
}
int isprime(int p)
{
if (p == 1) return 0;
int j, k = 0;
for(j = 2; j <= sqrt(p); j++)
{
if(p % j == 0)
{
k++; break;
}
}
if (k > 0) return 0;
else return 1;
}
int main()
{
int n, m;
scanf ("%d", &n);
while (n --)
{
scanf ("%d", &m);
if (isprime(m)) printf ("%d 0\n", m);
else
{
int i, j, dis_l = 0, dis_r = 0;
for (i = m; i > 0; i--)
{
if (isprime(i))
{
dis_l = abs(i, m);
break;
}
}
for (j = m; ; j++) // 在这里给j加上个范围,还一直没有看出来,心态要炸了!!!
{
if (isprime(j))
{
dis_r = abs(j, m);
break;
}
}
if (dis_l == 0) printf("%d %d\n", j, dis_r); // 如果左边的没有找到素数
else if (dis_l <= dis_r) printf("%d %d\n", i, dis_l);
else printf("%d %d\n", j, dis_r);
}
}
return 0;
}
这道题思路很容易想到,但是要注意数据边界,不然很容易卡到。