zoukankan      html  css  js  c++  java
  • 06-语言入门-06-素数距离问题

     
    描述
    现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
    如果输入的整数本身就是素数,则输出该素数本身,距离输出0

    输入
    第一行给出测试数据组数N(0<N<=10000)
    接下来的N行每行有一个整数M(0<M<1000000),

    输出
    每行输出两个整数 A B.
    其中A表示离相应测试数据最近的素数,B表示其间的距离。

    样例输入
    3
    6
    8
    10
    样例输出
    5 1
    7 1
    11 1
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define true 1
    #define false 0

    static int isPrimeNumber(int number);
    static int calNeighbor(int number);

    int main()
    {
         int readLen = 0;
         scanf("%d",&readLen);
         getchar();
        
         while(readLen > 0)
         {
              int calNum = 0;
              scanf("%d",&calNum);
              getchar();
             
              int result = calNeighbor(calNum);
              printf("%d %d ",result,abs(calNum-result));
             
              --readLen;
         }
        
         return 0;
    }

    static int isPrimeNumber(int number)
    {
         if(number < 2)
              return false;
             
         int i=2;
         int k = sqrt(number);
         for(;i<=k;++i)
         {
              if(number%i == 0)
                        break;
         }
        
         if(i > k)
              return true;
         else
              return false;
    }

    static int calNeighbor(int number)
    {
         if(isPrimeNumber(number))
              return number;
             
         if(number < 2)
              return 2;
        
         //左侧
         int left = number -1;
         for(;left>1;--left)
         {
              if(isPrimeNumber(left))
                   break;
         }    
        
         //右侧
         int right = number + 1;
         int step = 1;
         int interval = number - left;
         while(step < interval)
         {
              if(isPrimeNumber(right))
                   return right;
              ++right;
              ++step;
         }
        
         return left;
    }

    需要注意的地方:
    1.素数的判定,最开始笔者使用了素数定义的判断方法,提交代码后一直超时。
    2.对于 0 1这两个数一定要注意,题目中的测试数据包括了这两个数。
    3.可以将10000+10000右侧最近的素数放在一个数组里面(11000以内),这样在判断素数的时候时间是O(1)。
    对于大数据,将参考数据或者固定的数据预先初始化,以缩减重复性的工作往往是唯一的解决方案。
     
  • 相关阅读:
    半夜删你代码队 Day6冲刺
    半夜删你代码队 Day5冲刺
    半夜删你代码队 Day4冲刺
    半夜删你代码队 Day3冲刺
    Scrum 冲刺博客集合
    团队项目6——复审与事后分析
    Alpha阶段项目复审
    事后Postmortem会议
    团队作业5-测试与发布
    Scrum 冲刺第七天
  • 原文地址:https://www.cnblogs.com/sharpfeng/p/5141190.html
Copyright © 2011-2022 走看看