Count the number of prime numbers less than a non-negative number, n.
Example:
Input: 10
Output: 4
Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.
trick:
我们判断100是否为素数时,在1处,没必要遍历i>10(即100的开方)以后的数。(这个自己想为什么)
注意到2处,素数必然是奇数,而遍历j的时候,奇数加奇数必然为偶数,而偶数必然不可能为素数。
为加快速度,我们可以2*该素数,见代码下面的说明。
int countPrimes(int n) {
if (n < 3)
return 0;
bool res[n];
memset(res, true, sizeof(res));
int counts = 2;
for (int i = 2; i * i < n; i++) { //1
if (res[i]) {
int step= (i > 2) ? (i << 1) : 2;
for (int j = i * i; j < n; j += step) { //2
if (res[j]) { //加个判断速度更快
res[j] = false;
counts++;
}
}
}
}
return n - counts;
}
/*
例子n=100的遍历
其中,一个数字的行数代表step,即2,6,10,14为step,step下面将数组设置为false
2
4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50
52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98
6
9 15 21 27 33 39 45 51 57 63 69 75 81 87 93 99
10
25 35 45 55 65 75 85 95
14
49 63 77 91
*/