题目:
给定一个数字 n,求小于 n 的质数的个数。
质数又称素数,指的是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然
数。值得注意的是,每一个数都可以分解成质数的乘积。
题解:
埃拉托斯特尼筛法(Sieve of Eratosthenes,简称埃氏筛法)是非常常用的,判断一个整数是
否是质数的方法。并且它可以在判断一个整数 n 时,同时判断所小于 n 的整数,因此非常适合这
道题。其原理也十分易懂:从 1 到 n 遍历,假设当前遍历到 m,则把所有小于 n 的、且是 m 的倍
数的整数标为和数;遍历完成后,没有被标为和数的数字即为质数。
class Solution {
public int countPrimes(int n) {
int[] isPrime=new int[n];
Arrays.fill(isPrime,1);
int ans=0;
for(int i=2;i<n;++i){
if(isPrime[i]==1){
ans+=1;
if((long)i*i<n){
for(int j=i*i;j<n;j+=i){
isPrime[j]=0;
}
}
}
}
return ans;
}
}