JS判断一个数是否为质数

判断是否是素数

非正则实现
function isPrime(num){
    // 判断是否为数字
    if(typeof num !== "number" || !Number.isInteger(num)){      
    // Number.isInterget 判断是否为整数
        return false
    }

    //因为2是比较特殊的质数,所以先拿出来
    if(num == 2){
        return true
    }else if(num % 2 == 0){  //大于2 的偶数都不是质数
        return false
    }
    //依次判断是否能被奇数整除,最大循环为数值的开方
    let squareRoot = Math.sqrt(num)
    //因为2已经验证过,所以从3开始;且已经排除偶数,所以每次加2
    for(let i = 3; i <= squareRoot; i += 2) {
      if (num % i === 0) {
         return false
      }
    }
    return true
}
正则实现
function isPrime(num) {
return !/^1?$|^(11+?)\1+$/.test(Array(num+1).join('1'))
}

console.log(isPrime(19)) // true

正则表达式注解
首先,我们看到这个表达式中有“|”,也就是说这个表达式可以分成两个部分:/^1? //(11+?)\1+ / 和 / ( 11 + ? ) \1 + /

  • 第一部分:/^1?$/, 匹配“空串”以及字串中只有一个“1”的字符串

  • 第二部分:/^(11+?)1+ /(11+?)1+ / , 这 个 部 分 是 整 个 表 达 式 的 关 键 部 分 。 其 可 以 分 成 两 个 部 分 , ( 11 + ? ) 和 1 + ,前半部匹配以“11”开头的并重复0或n个1的字符串,后面的部分意思是把前半部分作为一个字串去匹配还剩下的字符串1次或多次(这句话的意思是——剩余的字串的1的个数要是前面字串1个数的整数倍,也就是值是否是2,3,4…的整数倍)

  • Array(num+1).join(‘1’),Array(num+1)表示有num个元素的空数组,join(1)将数组中每个元素用1连接成一个字符串(num+1个数组需要用num个1连接),所以这个表达式就是num个1组成的字符串

  • 上面介绍的正则表达式是取非素数,要得到素数还得要对整个表达式求反
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值