统计所有小于非负整数n的质数的数量
1、暴力解法一
class Solution {
public int countPrimes(int n) {
int count = 0;
if(n==0) return 0;
for(int i=2; i<n; i++) {
int j = 0;
for(j=2;j<i;j++) {
if(i%j==0) break;
}
if(j==i) count++;
}
return count;
}
}
2、暴力解法二
class Solution {
public int countPrimes(int n) {
int count = 0;
if(n==0) return 0;
for(int i=2; i<n; i++) {
int j = 2;
for(;j*j<=i;j++) {
if(i%j==0) break;
}
if(j*j>i) {
//System.out.println("the count is:::" + count+ ":::i::" + i);
count++;
}
}
return count;
}
}
上述两个解法类似,只不过解法二的时间复杂度要低一些,但是两个都超出时间限制。
3、埃氏筛
动图
3.1
public static int countPrimes(int n) {
if(n==0 || n==1) return 0;
boolean[] isPrime = new boolean[n];
Arrays.fill(isPrime, true);
int ans = 0;
isPrime[0] = false;
isPrime[1] = false;
for (int i = 2; i*i<n; ++i) {
if (isPrime[i]) {
for(int j=i+i;j<n;j+=i) {
isPrime[j] = false;
}
}
}
for(int i=0;i<n;i++) {
if(isPrime[i]) {
System.out.println("the i is:::" + i);
ans+=1;
}
}
return ans;
}
3.2 提升3.1的时间复杂度
public static int countPrimes(int n) {
if (n == 0 || n == 1)
return 0;
boolean[] isPrime = new boolean[n];
Arrays.fill(isPrime, true);
int ans = 0;
isPrime[0] = false;
isPrime[1] = false;
for (int i = 2; i < n; ++i) {
if (isPrime[i]) {
ans+=1;
if (i * i < n) {
for (int j = i + i; j < n; j += i) {
isPrime[j] = false;
}
}
}
}
return ans;
}