求一段代码,用js求前500个素数

JavaScript05

求一段代码,用js求前500个素数,第1张

以下代码可以实现JavaScript求n个素数,当n=500时满足题目需求。

function prime(n){

    var primeArr = [2]

    var isPrime = function(num, primeList){

        if(num == 2){

            return true

        }

        for(var i = 3, iLen = Math.sqrt(num), j = 1 i <= iLen i = primeList[j++]){

            if(num % i == 0){

                return false

            }

        }

        return true

    }

    if(isNaN(n) || n < 1){

        return []

    }

    for(var i = 0, iLen = n - 1, j = 3 i < iLen j+= 2){

        if(isPrime(j, primeArr)){

            primeArr.push(j)

            i++

        }

    }

    return primeArr

}

//函数调用

prime(500)//得到一个长度为500的数组,里面按顺序放着前500个素数

算法分析:

素数即除去1和其本身两个数之外,不能被任何数整除的整数。

由公理可知,如果一个整数能被分解成多个整数,则必有一个数不大于该整数的平方根(反证法可知,如果分解成的两个数都大于平方根,则乘积必大于原数),故在循环时,只需循环到该数的平方根即(Math.sqrt(num)为求平方根)

如果一个数能被2整除,则除2之外其他数都不是素数,故从3开始遍历能够减少循环次数

如果一个数能够被分解,则最终分解结果必然为多个素数之积,故循环时只需要尝试之前算好的素数能否整除当前的数,极大减少循环次数

500个素数不会存在2个素数之间间隔大于上一个素数的平方的情况,此函数在前提条件下是安全的

for(let i=1i<=100i++){

if(check(i)) {

console.log(i)

}

}

// 判断当前给定的数 num 是否为素数, 是素数返回 true, 否则返回 false

function check(num){

if(num === 1) {

// 1 不是素数也不是合数, 返回 false

return false

} else {

// 声明变量用于统计从1~根号下 num,之间 能被 num 整除的数的个数

let count = 0

for(let i=1i<=Math.sqrt(num)i++) {

if(num%i === 0) {

count++

// 当发现在1~根号下 num 之间有超过1个数可以被 num 整除, 说明 num 一定不是素数,直接返回false, 后面的数不用判断了

if(count >1) {

return false

}

}

}

// 因为素数只能被1和自身整除,

// 那么从1~根号下 num 之间一定只有一个数(1)可以被 num 整除, 所以当 count 等于1时, 这个num 就是素数

return count == 1

}

return false

}