https://leetcode.com/problems/count-primes/
找出小于n的质数,不包括n啊!!!被坑死
解法一:
对于某一个质数,他的倍数都不是质数,对于倍数进行染色。内层循环从p * p开始是因为2 * p 到 (p - 1) * p都已经被染过色了
public class Solution {
public int countPrimes(int n) {
int count = 0;
boolean[] mark = new boolean[n];
for (int p = 2; p <= Math.sqrt(n); p++) {
if (!mark[p]) {
for (int i = p; i * p < n; i++) {
mark[i * p] = true;
}
}
}
// 题目要求是找 *less than n* !!!!!所以是i < n
for (int i = 2; i < n; i++) {
if (!mark[i]) {
count++;
}
}
return count;
}
}
解法二:
做减法,只有奇数有可能是质数,然后再对奇数进行check,如果发现他是某个数的倍数,并且还未染色,就把他染色,同时count--
public class Solution {
public int countPrimes(int n) {
if (n <= 2) {
return 0;
}
// 偶数肯定不是质数
int count = n / 2;
// 已经被计算到的奇数合数为true,偶数和奇数质数以及未被计算到的奇数合数为false
boolean[] mark = new boolean[n];
// 保证i始终为奇数
for (int i = 3; i * i < n; i += 2) {
if (!mark[i]) {
// j += 2 * i,保证j始终为奇数
for (int j = i * i; j < n; j += 2 * i) {
if (!mark[j]) {
mark[j] = true;
count--;
}
}
}
}
return count;
}
}