统计所有小于非负整数 n 的质数的数量

129 阅读1分钟

第一种解法

这道题最开始是用最基础的方法做的,就是双层循环 外层循环1-n 内层循环2-sqrt(n)判断是否质数

var countPrimes = function (n) {
    let ret = 0,
        flag = 1;
    if (n < 2) {
        return 0
    }
    for (let i = 1; i < n; i++) {
        for (let j = 2; j <= Math.sqrt(i); j++) {
            if (i % j == 0) {
                flag = 0;
                break;
            }
        }
        if (flag == 2) {
            ret++;
        } else {
            flag = 2;
        }
    }
    return ret
};

第二种解法

采用厄拉多塞筛法

介绍:改算法在寻找素数时,采用了一种与众不同的方法:先将 2-N 的各数放入表中,然后在 2 的上面画一个圆圈,然后划去 2 的其他倍数;第一个既未画圈又没有被划去的数是 3,将它画圈,再划去 3 的其他倍数;现在既未画圈又没有被划去的第一个数是 5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。

这时,表中画了圈的以及未划去的那些数正好就是小于 N 的素数。

主要适用了ES6的两个数组方法

var countPrimes = function (n) {
    if (n <= 2) {
        return 0
    }
    // 生成一个0-n-1的数组
    let temp = [...new Array(n).keys()];
    temp[0] = temp[1] = null
    // console.log(temp)
    for (let i = 2; i < n; i++) {
        for (let j = 2; i * j <= n; j++) {
            temp[i * j] = null;
        }
    }
    //筛一下非null的值 filter是es6的一个数组方法,可以对数组进行一个筛选
    temp = temp.filter(function (a) {
        return a != null
    })
    // console.log(temp)
    return temp.length
}; 

原文链接:leetcode-cn.com/problems/co…