zoukankan      html  css  js  c++  java
  • 面试常备题素数的判断

         明年就要开始找工作了,所以现在正在准备中,恶补一些数据结构的基础知识和面试题目,因此,在这里不定期的整理一些题目。我发现,素数判断是一个很常见的算法,基本上,我看到的很多题目都要涉及到素数的判断,比如说,1024到687432的所有素数的和,或者720的N次方中,有哪些数是素数等等,大体涉及到素数的题目,核心问题就是要懂得如何判断素数。

           那么,如何判断素数呢?素数是指只能被自身和1整除的自然数,常见而且比较容易实现的算法是试除法:将该数N用<=N的所有素数去试除,若均无法整除,则N为素数。

             接下来我们就开始写代码了:

     boolean isPrime(int number) {
            boolean isPrime = true;
            for (int i = 2; i <= Math.sqrt(number); i++) {
                  if (number % i == 0) {
                      isPrime = false;
    } } return isPrime; }

             然后我们再进行测试:

    public class test{
      public static void main(String[] args){
          for(int i = 0; i < 100; i++){
             if(isPrime(i)){
               System.out.println(i + "是素数");
             }
          }
      }
    }

           输出结果是:

     2是素数
    3是素数
    5是素数
    7是素数
    11是素数
    13是素数
    17是素数
    19是素数
    23是素数
    29是素数
    31是素数
    37是素数
    41是素数
    43是素数
    47是素数
    53是素数
    59是素数
    61是素数
    67是素数
    71是素数
    73是素数
    79是素数
    83是素数
    89是素数
    97是素数

        代码并不需要背,只要知道算法,程序员就可以编写出想要的代码出来。

        所以,这里我就再一次重复一下算法:只要一个数N,在[2,sqrt(N)]的区间内,没有任何数可以整除它,它就是一个素数。为什么是2呢?因为0不可能作为除数,任何数都可以除以1。

         有关素数的判断还是一个小问题,就像上面讲的,需要结合具体的题目,而且,这些题目往往潜伏着陷阱,比如说,以下这道题目:

         在720的N次方中,有多少个是素数?

         这样的题目看似很简单,我们可以一下子就做出来:

         看代码:

    public class test{
          int number = 1;
          int counter = 0;
          for(int i = 0; i < Integer.MAX_VALUE; i++){
               number *= 720;
               if(isPrime(number){
                  counter++;
               }
          }
          System.out.println(counter);
    }

              做到这里,相信大家一定看出了问题:就是我们该如何确定那个N呢?这里使用了正整数的最大值,但我们知道,一定会出错,因为这样绝对超出了整数的最大范围,确定N才是这道题目的关键:

     int getRange(int number, int divisor) {
          int range = 0;
          while ((number / divisor != 0)) {
               range++;
               number = number / divisor;
           }
          return range;
    }

               接着是进行测试:

    public static void main(String[] args) {
          int number = 1;
          int divisor = 720;
          int range = getRange(Integer.MAX_VALUE, divisor);
          for (int i = 0; i < range; i++) {
                number *= divisor;
                if (isPrime(number)) {
                    System.out.println(number + "是素数");
                 }
           }
    
    }

               必须确保我们的判断数始终在java整数的范围内。

               这里就卖弄一下java的整数范围:-2的31次方到2的31次方减1。

        

  • 相关阅读:
    PHP的来龙去脉
    最近动态
    motorola usb driver下载
    C#泛型学习笔记
    Visual Studio 2008 SP1 (Beta)
    【Linux操作系统分析】计算机是怎样工作的
    细嚼慢咽C++primer(1)——指针,void*型指针,const限定符(2)
    初识Hadoop(1)
    2013.05.14_C++primer笔记
    初始Hadoop(3)
  • 原文地址:https://www.cnblogs.com/wenjiang/p/2940396.html
Copyright © 2011-2022 走看看