数据结构与算法算法提高之LeetCode刷题数据结构和算法分析

力扣(LeetCode) - 204 计算质数

2019-04-24  本文已影响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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读