如果你想在校招中顺利拿到更好的offer,阿秀建议你多看看前人的经验 ,比如准备简历实习上岸经历校招总结阿里、字节、腾讯、美团等一二线大厂真实面经也欢迎来一起参加秋招打卡活动 等;如果你是计算机小白,学习/转行/校招路上感到迷茫或者需要帮助,可以点此联系阿秀;免费分享阿秀个人学习计算机以来的收集到的好资源,点此白嫖;如果你需要《阿秀的学习笔记》网站中求职相关知识点的PDF版本的话,可以点此下载

# 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