统计所有小于非负整数 n 的质数的数量。
题解一:枚举法,对于小于非负整数n的每一个数,都检查它是否为质数。
class Solution {
public int countPrimes(int n) {
int ans = 0;
for (int i = 2; i < n; ++i) {
ans += isPrime(i) ? 1 : 0;
}
return ans;
}
//判断是否为质数
public boolean isPrime(int x) {
for (int i = 2; i*i <= x; ++i) {
if (x % i == 0) {
return false;
}
}
return true;
}
}
题解二:埃氏筛,我们可以考虑到这样一个事实,如果x是质数,则2x、3x、4x…一定不是质数,从这一点入手的话,我们可以设置一个数组int [ ]isPrime,如果isPrime[ i ]=1,则说明 i 是质数,如果isPrime[ i ]=0,则说明 i 不是质数,我们依旧是遍历区间[ 2,n ]中的每一个数 i,如果i是质数,则将isPrime[ 2i ]、isPrime[ 3i ]、isPrime[ 4i ]…设置为0,显然这样做的话是不会将质数的isPrime值设置为0的,也不会漏掉任何一个合数
class Solution {
public int countPrimes(int n) {
int count=0;
int []isPrimes=new int[n];
Arrays.fill(isPrimes,1);
for(int i=2;i<n;i++){
if(isPrimes[i]==1){
count++;
//i*i-1、i*i-2...i*2已经被设置为合数
if ((long) i * i < n) {
for (int j = i * i; j < n; j += i) {
isPrimes[j] = 0;
}
}
}
}
return count;
}
}