/*
素数距离问题
时间限制:3000 ms | 内存限制:65535 KB
难度:2
描述
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右
有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0
输入
第一行给出测试数据组数N(0
接下来的N行每行有一个整数M(0
输出
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
样例输入
3
6
8
10
样例输出
5 1
7 1
11 1
*/
//呵呵 ,用
c语言写的,
#include
#include
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);
}
else
{
printf(no );
}
}
*/
scanf(%d, &n);
while (n--)
{
scanf(%d, &num);
if (num == 1)
{
printf(2 1 );
continue;
}
for (i = 0; i < num; ++i)
{
flag++;
temp1 = num + i*temp2;
// printf(temp = %d %d , 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 , 2*num-temp1, temp1-num);
}
else
{
printf(%d %d , temp1, temp1-num);
}
}
else if (temp1 < num)
{
printf(%d %d , temp1, num-temp1);
}
else if (temp1 == num)
{
printf(%d 0 , num);
}
}
return 0;
}
int isPrime(int n)
{
int i = 2, a;
a = sqrt(n) + 1;
// printf(a = %d %lf , a, sqrt(3.0));
if (n == 2)
{
return 1;
}
for (i = 2; i <= a; ++i)
{
if (n % i == 0)
{
return 0;
}
}
return 1;
}
?
?
|