题目描述
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
思路:
1、暴力解法,遍历从2到n的所有数,再看它是否能被小于它的数整除。(此方法在较大的数面前会计算超时)
2、厄拉多筛选法:先将默认所有数为质数,选中数字2,然后将数字2的倍数设为非质数;选中数字3,然后将数字3的倍数设为非质数。重复这个步骤。
//暴力解法
class Solution {
public int countPrimes(int n) {
int count=0;
for(int i=2;i<n;i++){
boolean f=true;
for(int j=2;j<i;j++){
if(i%j==0){
f=false;
}
}
if(f){
count++;
}
}
return count;
}
}
//厄拉多筛选法
class Solution {
public int countPrimes(int n) {
int count=0;
boolean[] f=new boolean[n];
for(int i=2;i<n;i++){
if(!f[i]){//java中boolean型数组的默认值是false
count++;//先将该数计数
for(int j=2*i;j<n;j+=i){
f[j]=true;//将i的倍数置为true,代表该数为非质数
}
}
}
return count;
}
}