描述
给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。
分析
厄拉多塞筛法:
求小于n的质数个数,用长是n+1的标记数组,表示一个数是质数还是合数。
从2开始遍历,若当前数是质数,count++,并且把下标是当前数倍数的元素标记为合数。
class Solution {
public int countPrimes(int n) {
if(n < 2) return 0;
boolean[] nums = new boolean[n+1];
int count = 0;
for(int i = 2; i < n; i++){
//这里就不再判断i是指数还是合数,因为从2开始遍历,i前面的质数已经把质数的倍数全标记为合数了.
//一个合数是由多个比他小的质数相乘得来。
//每次遍历到一个质数,会把这个质数的而倍数都标记为合数。
//若遍历到i,而num[i]是true,说明i并不是任何一个小于i的质数的倍数。
if(!nums[i]){
count++;
for(int j = i + i; j <= n; ){
nums[j] = true;
j += i;
}
}
}
return count;
}
}