素数距离问题

素数距离问题

时间限制: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
 1 #include <stdio.h>
 2 #include <math.h>
 3 
 4 #define TRUE 1
 5 #define FALSE 0
 6 
 7 int isPrime(int);
 8 
 9 int main()
10 {
11     int times;                        //测试数据组数
12 
13     scanf("%d", &times);
14 
15     while(times > 0)
16     {
17         int num;                    //待处理数据
18 
19         scanf("%d", &num);
20 
21         if(num == 1)                //如果输入的是1
22         {
23             printf("%d %d\n", 2, 1);
24             times --;
25             continue;
26         }
27         else if(isPrime(num) == TRUE)    //输入的是质数
28         {
29             printf("%d %d\n", num,0);
30             times --;
31             continue;
32         }
33         else
34         {
35             int num_left, num_right;
36             int i = 1;
37             for(; i < num; i ++)
38             {
39                 num_left = num - i;
40                 num_right = num + i;
41                 if(isPrime(num_left) == TRUE && isPrime(num_right) == TRUE)            //左右都是质数 
42                 {
43                     printf("%d %d\n", num_left, i);                                    //输出左边的数和距离
44                     break;
45                 }
46                 else if(isPrime(num_left) == TRUE || isPrime(num_right) == TRUE)
47                 {
48                     if(isPrime(num_left) == TRUE)
49                     {
50                         printf("%d %d\n", num_left, i);
51                         break;
52                     }
53                     else
54                     {
55                         printf("%d %d\n", num_right, i);
56                         break;
57                     }
58                 }
59             }
60         }
61         times --;
62     }
63 }
64 //判断num是否为质数
65 int isPrime(int num)
66 {
67     int flag = TRUE;
68     int i = 0;
69 
70     for(i = 2; i <= sqrt(num); i ++)
71     {
72         if(num % i == 0)
73         {
74             flag = FALSE;
75             break;                    //不是质数
76         }
77     }
78 
79     if(num == 1)
80         flag = FALSE;                //1不是质数
81 
82     return flag;
83         
84 }

代码还可以优化一下

posted on 2014-04-24 00:12  luckygxf  阅读(404)  评论(0编辑  收藏  举报

导航