力扣(LeetCode) - 204 计算质数

作者: 小怪兽大作战 | 来源:发表于2019-04-24 11:45 被阅读0次

    本题可以用厄拉多塞筛法(厄拉多塞是一个数学家,他发名了一种质数筛选法叫做厄拉多塞筛法)

    题目:
    统计所有小于非负整数 n 的质数的数量。
    示例:
    输入: 10
    输出: 4
    解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

    思路:

    质数又称为素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫质数;否则称为合数。
    厄拉多塞筛法:厄拉多塞是一位古希腊数学家,他在寻找小于N的素数时,采用了一种与众不同的方法:先将2-N的各数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于N的素数。
    我们以求10以内的质数为例,看一下下面这张图。


    image.png

    代码

    java

    class Solution {
        public int countPrimes(int n) {
            if(n < 3)
                return 0;
            boolean [] dp = new boolean [n];     //index为false的是质数
            dp[0] = true;                        //先把0 和 1 标记为合数(非质数)
            dp[1] = true;
            int res = 0;
            for(int i = 2; i * i < n; i++){     //遍历元素
                if(!dp[i]){                     //如果是质数,将它的整数倍都标记位合数
                    for(long j = i * i; j < n; j += i)
                        dp[(int)j] = true;
                }
            }
            int ans = 0;
            for(boolean b : dp)                //统计质数数量
                ans += !b ? 1 : 0;
            return ans;
        }
    }
    

    相关文章

      网友评论

        本文标题:力扣(LeetCode) - 204 计算质数

        本文链接:https://www.haomeiwen.com/subject/pfwwgqtx.html