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)。
    对于大数据,将参考数据或者固定的数据预先初始化,以缩减重复性的工作往往是唯一的解决方案。
     
  • 相关阅读:
    LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)
    LeetCode 21. Merge Two Sorted Lists (合并两个有序链表)
    LeetCode 720. Longest Word in Dictionary (字典里最长的单词)
    LeetCode 690. Employee Importance (职员的重要值)
    LeetCode 645. Set Mismatch (集合不匹配)
    LeetCode 500. Keyboard Row (键盘行)
    LeetCode 463. Island Perimeter (岛的周长)
    115.Distinct Subsequences
    55.Jump Game
    124.Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/sharpfeng/p/5141190.html
Copyright © 2011-2022 走看看