最简单一种
class Solution {
public int countPrimes(int n) {
int ans = 0;
for(int i = 2; i < n; i++) {
if(isPrimes(i)) ans++;
}
return ans;
}
private boolean isPrimes(int n) {
for(int i = 2; i * i <= n; i++) {
if(n % i == 0) {
return false;
}
}
System.out.println(n);
return true;
}
}
埃氏筛 类似dfs
private static int erichsen(int n) {
//是否是质数,1-质数 0-合数
int[] isPrime = new int[n];
Arrays.fill(isPrime, 1);
//采用i < n / i 防止i*i超范围
for (int i = 2; i < n / i; i++) {
if (isPrime[i] == 1) {
//删除i的倍数
for (int j = i * i; j < n; j += i) {
isPrime[j] = 0;
}
}
}
int count = 0;
for (int i = 2; i < n; i++) {
if (isPrime[i] == 1) {
count++;
}
}
System.out.println(count);
}
欧拉筛 类似bfs
private static int euler(int n) {
//判断是否是质数
int[] isPrime = new int[n];
//存放质数
int[] primes = new int[n];
int k = 0;
Arrays.fill(isPrime, 1);
int count = 0;
for (int i = 2; i < n; i++) {
if (isPrime[i] == 1) {
primes[k++] = i;
count++;
}
for (int j = 0; primes[j] * i < n; j++) {
//每个质数都和i相乘 得到合数
isPrime[primes[j] * i] = 0;
//primes[j]是i的一个质因数
if (i % primes[j] == 0) {
break;
}
}
}
System.out.println(count);
}