判断是否是素数
非正则实现
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组成的字符串
- 上面介绍的正则表达式是取非素数,要得到素数还得要对整个表达式求反