(一) 常规法
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的素数。
思路:如果当前数为质数,则其倍数就不是质数
// 找出小于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)