判断一个数是不是质数

(一) 常规法

function isPrime(number) {
   if (typeof number !== 'number' || number<2) {
      // 不是数字或者数字小于2
      return false;
   }
 
   if (number === 2) {//2是质数
      return true;
   } else if (number % 2 === 0) {//排除偶数
      return false;
   }
   var squareRoot = Math.sqrt(number); // 开平方
  //因为2已经验证过,所以从3开始;且已经排除偶数,所以每次加2
   for(var i = 3; i <= squareRoot; i += 2) {
      if (number % i === 0) {
         return false;
      }
   }
   return true;
}

(二)厄拉多塞筛法

简单介绍一下厄拉多塞筛法。厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2-N的各数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于 N的素数。

思路:如果当前数为质数,则其倍数就不是质数

avatar

// 找出小于number的所有质数
    var isPrime = function (number) {
      // 生成一个 1-number 的数组
      // Array.from 接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组
      // 创建一个长度为n的整数数组,所有元素值变为1,1表示对应的索引值为质数,0表示对应的索引值为非质数。
      var arr = Array.from({ length: number}, (item, index) => {
        return index + 1
      })
      // 从2开始遍历,如果当前数字值为1,则获取其所有倍数,将元素值变为0(标记为非质数)
      // 遍历完成后再次遍历数组,从2开始,记录元素为1的个数,即为对应的质数个数。
      console.log('创建新数组', arr)
      // 从2开始 2是质数 1不是质数
      for(var i = 2; i <= number; i++) {
        if (arr[i - 1] !== 0) { // 判断与i相同的值是不是0 如果已经是0 说明他的倍数一定也是0 不用向下找了
          for (var j = 2; i * j <= number ;j++) {
            arr[ i * j - 1] = 0
          }
        }
      }
      console.log('非质数置为0', arr)
      arr = arr.filter((item, index) => {
        return item && item !== 1
      })
      console.log('质数数组', arr)
    }
    isPrime(10)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值