素数距离问题
描述
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0
- 输入
- 第一行给出测试数据组数N(0<N<=10000)
- 接下来的N行每行有一个整数M(0<M<1000000)
- 输出
- 每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。 - 样例输入
3 6 8 10
样例输出
5 1 7 1 11 1
测试代码
1 #include <stdio.h> 2 3 int isPrime(int num) 4 { 5 int i; 6 if (num == 2) 7 { 8 return 1; 9 } 10 if (!(num & 1) || num < 2) 11 { 12 return 0; 13 } 14 for (i = 3; i * i <= num; i += 2) 15 { 16 if (num % i == 0) 17 { 18 return 0; 19 } 20 } 21 return 1; 22 } 23 24 int main() 25 { 26 int n, m, leftNum, rightNum, leftDis, rightDis; 27 scanf("%d", &n); 28 while (n--) 29 { 30 scanf("%d", &m); 31 if (isPrime(m)) 32 { 33 printf("%d 0\n", m); 34 } 35 else 36 { 37 leftNum = rightNum = m; 38 //求出m左边最大的素数 39 while (!(isPrime(leftNum)) && leftNum > 0) 40 { 41 leftNum--; 42 } 43 leftDis = m - leftNum; 44 //求出m右边最小的素数 45 while (!(isPrime(rightNum))) 46 { 47 rightNum++; 48 } 49 rightDis = rightNum - m; 50 51 if (leftNum == 0) //左边没找到 52 { 53 printf("%d %d\n", rightNum, rightDis); 54 } 55 else if (leftDis <= rightDis) //输出距离小的,左右相等则输左 56 { 57 printf("%d %d\n", leftNum, leftDis); 58 } 59 else 60 { 61 printf("%d %d\n", rightNum, rightDis); 62 } 63 } 64 } 65 return 0; 66 }

浙公网安备 33010602011771号