力扣(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;
}
}