统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
解题思路:
开始暴力计算法,发现超时,查资料才知道有一个埃拉托色尼 算法
大意是:要得到自然数n以内的全部质数,必须把不大于根号n的所有质数的倍数剔除,剩下的就是质数。
所以:
class Solution {
public int countPrimes(int n) {
if (n<=2) return 0;
if(n==3) return 1;
int count = 0;
boolean[] flag = new boolean[n];
for (int i = 2; i < n; i++) {
flag[i] = true; //先初始化为true
}
for (int i = 2; i * i < n; i++) { //这一次for循环找出所有不是质数的数(也就是说被筛掉了)
if (!flag[i]) {
//既然已经被筛掉了就不用管了
continue; }
else {
for (int j = i * i; j < n; j += i) {
//由于i现在是一个质数, 那么i的平方一定不是质数,i^2 + i; i^2 + 2i也一定不是质数
flag[j] = false;
}
}
} //所有不是质数的数已经全部筛掉
for (int i =2;i<n;i++){
if(flag[i]==true) {
// System.out.println(i+"------"+isPrimes(i));
count+=1;
}
}
return count;
}
}