一、题目链接
https://leetcode.cn/problems/count-primes/
二、解题思路
三、实施步骤
四、Java程序
class Solution {
/**
* 返回小于给定上界的质数数量
*
* @param n int类型的整数,代表给定上界
* @return int类型的整数,代表小于n的质数数量
*/
public int countPrimes(int n) {
if (n < 3) { // 不存在质数的情况
return 0;
}
if (n < 4) { // 只存在一个质数2的情况
return 1;
}
boolean[] isPrime = new boolean[n]; // 标记[0,n-1]区间内的数是否质数,默认false
isPrime[2] = true; // 标记2是质数
/* 从3开始,只有奇数才可能是质数 */
for (int i = 3; i < n; i = i + 2) {
isPrime[i] = true;
}
/* 从3开始,每个奇数的奇数倍肯定不是质数 */
for (int i = 3; i * i < n; i = i + 2) {
if (isPrime[i]) {
for (int j = i; j * i < n; j = j + 2) {
isPrime[i * j] = false;
}
}
}
int ans = 0; // 计数质数,初始时为0
/* 统计质数数量 */
for (int i = 2; i < n; i++) {
ans = (isPrime[i] ? ans + 1 : ans);
}
return ans;
}
}