质数相关题解及优化

306 阅读1分钟

1、判断一个数是否为质数(素数)

什么是质数?

概念:只能被1它本身 整除的数叫做质数(素数)

所以,根据概念推导,能被除了 1 和 它本身 之外的数整除的数就不是质数。

所以只需要把这个数之前的数(除了1)都除一遍,不就可以啦。开写!

function _isPrime(num) {
      for (var i = 2; i < num; i++) {
        if (num % i == 0) {
          return "不是质数";
        }
      }
    //这行代码一定要写在for循环外面,如果放在里面,遇到像9这样的数字,就会把它判断成“是质数”
      return "是质数"
    }
  • 代码说明:
    • 由概念可得,首先要排除 1 和 该数本身 的干扰。所以for循环从2开始,到num -1 结束

2、判断一个数是否为质数-优化1

在我们会写代码之后,我们可以考虑优化一下这几行代码

  • 优化代码可以从以下几个方面思考:

    • 使用的算法,即是否存在更简单的算法,从而减少运算过程

    • 观察for循环中声明的变量,是否可以拿到for循环外面,减少代码的运算次数

    • 重复使用的语句可以封装到方法中,谁使用谁调用。

根据以上方面进行优化。代码如下:

 function _Prime(num) {
      var n = num / 2;
      //优化:1.一个数最大的约数是他的一半
      //     2.将除以二的操作放到循环外面,这样会减少计算
      for (var i = 2; i <= n; i++) {
        if (num % i == 0) {
          return "不是质数";
        }
      }
      return "是质数"
    }
  • 代码说明:

    • for循环的范围改为num 的一半

    • 原理:每个数的最大的约数要么是这个数的一半,要么比该数的一半要小。

      ​ 因为最小的约数是2,假设该数为a,另一个约数为x,那么2x > a,所以最大约数一定小于等于 a / 2.

3、判断一个数是否为质数-优化2

 function _Prime(num) {
      var n = Math.sqrt(num);
      //优化:1.n 改为 根号num
      //     2.将除以二的操作放到循环外面,这样会减少计算
      for (var i = 2; i < n; i++) {
        if (num % i == 0) {
          return "不是质数";
        }
      }
      return "是质数"
    }
  • 代码说明:

    • for循环的范围改为 (根号num)

    • 原理:一个数的任意两个约数一定在该数开根号后的值的两边。

      ​ 设一个数为x,两个约数分别为a,b,假设a <= (根号x),则 a / (根号x) <= 1;

      ​ a * b = x,两边同时除以 (根号x), 变成 a / (根号x) * b = (根号x)

      ​ 两边同时除以b,得 a / (根号x) = (根号x) / b

      ​ 所以 (根号x) / b <= 1,最终得 b >= (根号x)

4、输出2-100以内所有质数

如果以上代码搞明白的话,这个题不在话下。

function _PrimeArr() {
      var arr = [];
      for (var i = 2; i < 200; i++) {
        var flag = true;
        //var n = i / 2;
        var n = Math.sqrt(i)
        //优化:给i开根号,会比i/2再减少一半时间
        for (var j = 2; j <= n; j++) {
          if (i % j == 0) {
            flag = false;
            break;
          }
        }
        if (flag == true) {
          arr[arr.length] = i;
        }
      }
      return arr
    }
  • 代码讲解:
    • 声明变量flag,目的是为了标记,将质数和非质数分开。
    • 外层for循环是为了获得数字,内层for循环用来判断该数是否为质数

本人小白,有什么不对的地方或者还能继续优化的地方请大佬指出,谢谢大家!