• 面试常备题素数的判断


         明年就要开始找工作了,所以现在正在准备中,恶补一些数据结构的基础知识和面试题目,因此,在这里不定期的整理一些题目。我发现,素数判断是一个很常见的算法,基本上,我看到的很多题目都要涉及到素数的判断,比如说,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。

        

  • 相关阅读:
    【转】C#解析HTML 拓荒者
    【转】Sql递归查询 拓荒者
    【转】sql if else 语句 拓荒者
    数据库范式解析 拓荒者
    C#和sqlserver中生成新的32位GUID 拓荒者
    Linq To Sql CRUD操作示例 拓荒者
    让UserControl可以被验证 拓荒者
    【转】把一个表的数据插入到另一个表:INSERT INTO SELECT / SELECT INTO 拓荒者
    【转】Sql去除重复记录 拓荒者
    Linq To Object 示例 拓荒者
  • 原文地址:https://www.cnblogs.com/wenjiang/p/2940396.html
Copyright © 2020-2023  润新知