一、题目
二、代码
暴力解法。从质数n的定义入手,遍历从2到n-1,如果取余为0则为合数。可以优化即不用遍历到n-1,而是到根号n。
class Solution {
public int countPrimes(int n) {
int count = 0;
for (int i = 2; i < n; i++) {
if (isPrime(i)) {
count++;
}
}
return count;
}
private boolean isPrime(int num) {
int max = (int)Math.sqrt(num);
for (int i = 2; i <= max; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
埃及筛 。
- 初始化长度为n 的标记数组,表示这个数组是否为质数,数组初始化所有的数都是质数。
- 从 2 开始将当前数字的倍数全都标记为合数。标记到根号n 时停止。
- 当前素数 x的倍数时,是从 x^2 开始的。原因是如果 x > 2,那么 2*x 肯定被素数 2 给过滤了,最小未被过滤的肯定是 x^2。
class Solution {
public int countPrimes(int n) {
//质数则为true
boolean[] isPrim = new boolean[n];
Arrays.fill(isPrim, true);
//质数范围从2到Math.sqrt(n)
for(int i = 2; i * i < n; i++){
for(int j = i * i; j < n; j += i){
if(isPrim[j]){
isPrim[j] = false;
}
}
}
int count = 0;
for(int i = 2; i < n;i++){
if(isPrim[i]){
count++;
}
}
return count;
}
}