• 素数距离问题


    素数距离问题

    时间限制: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
    ", 2, 1);
    24             times --;
    25             continue;
    26         }
    27         else if(isPrime(num) == TRUE)    //输入的是质数
    28         {
    29             printf("%d %d
    ", 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
    ", 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
    ", num_left, i);
    51                         break;
    52                     }
    53                     else
    54                     {
    55                         printf("%d %d
    ", 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 }

    代码还可以优化一下

  • 相关阅读:
    MySQL修改表中字段的字符集
    JMM内存模型相关笔记整理
    可重入锁与不可重入锁
    ForkJoin、并行流计算、串行流计算对比
    CyclicBarrier的用法
    git笔记整理-learnGitBranching
    Git 学习相关笔记
    《0day2》学习笔记-part5(书目第十二章(上))
    《0day2》学习笔记-part4(书目第八、九、十、十一章)
    《0day2》学习笔记-part3(书目第六、七章)
  • 原文地址:https://www.cnblogs.com/luckygxf/p/3684370.html
Copyright © 2020-2023  润新知