# 204. 计数质数

力扣原题链接(点我直达) (opens new window)

统计所有小于非负整数 n 的质数的数量。

示例:

输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
1
2
3

# 第一版,暴力法,超时

int isPrimes(int i) {
	for (int j = 2; j * j <= i; ++j) {
		if (i % j == 0) return 0;
	}

	return 1;


}
int countPrimes(int n) {
	if (n <= 2) return 0;

	int sum = 0;
	for (int i = 2; i < n; ++i) {
		sum += isPrimes(i);
	}

	return sum;

}




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 第二版,比较牛逼的一种解法

执行用时 :40 ms, 在所有 cpp 提交中击败了91.18%的用户

内存消耗 :21.6 MB, 在所有 cpp 提交中击败了5.23%的用户

这题搜到一个非常牛逼的算法,叫做厄拉多塞筛法. 比如说求20以内质数的个数,首先0,1不是质数.2是第一个质数,然后把20以内所有2的倍数划去.2后面紧跟的数即为下一个质数3,然后把3所有的倍数划去.3后面紧跟的数即为下一个质数5,再把5所有的倍数划去.以此类推.

int countPrimes(int n) {
	vector<int> a(n);
	int count = 0;
	for (int i = 2; i < n; i++)
		a[i] = 1;

	for (int i = 2; i < n; i++)
		if (a[i])
		{
			count++;
			for (int j = 2 * i; j < n; j += i)
				a[j] = 0;
		}

	return count;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17