/*
素数距离问题
时间限制: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
*/
//呵呵 ,用c语言写的,
#include <stdio.h>
#include <math.h>
int isPrime(int n);
int main()
{
int i, n, num, temp1 = 0, temp2 = -1, flag = 0;
/* while(1)
{
scanf("%d", &n);
if (isPrime(n))
{
printf("is Prime\n", n);
}
else
{
printf("no\n");
}
}
*/
scanf("%d", &n);
while (n--)
{
scanf("%d", &num);
if (num == 1)
{
printf("2 1\n");
continue;
}
for (i = 0; i < num; ++i)
{
flag++;
temp1 = num + i*temp2;
// printf("temp = %d %d\n", temp1, temp2);
temp2 = temp2 * (-1);
if ((temp1>2 && temp1%10%2==0) || (temp1>3 && temp1%3 == 0) || (temp1>5 && temp1%5==0))
{
if (flag % 2 != 0)
{
--i;
}
continue;
}
else
{
if (isPrime(temp1))
{
break;
}
}
if (flag % 2 != 0)
{
--i;
}
}
if (temp1 > num)
{
if (isPrime(num-(temp1-num)))
{
printf("%d %d\n", 2*num-temp1, temp1-num);
}
else
{
printf("%d %d\n", temp1, temp1-num);
}
}
else if (temp1 < num)
{
printf("%d %d\n", temp1, num-temp1);
}
else if (temp1 == num)
{
printf("%d 0\n", num);
}
}
return 0;
}
int isPrime(int n)
{
int i = 2, a;
a = sqrt(n) + 1;
// printf("a = %d %lf\n", a, sqrt(3.0));
if (n == 2)
{
return 1;
}
for (i = 2; i <= a; ++i)
{
if (n % i == 0)
{
return 0;
}
}
return 1;
}
作者:http://blog.csdn.net/lp310018931