《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(67)混元无极算素数 - 埃拉托斯特尼筛法
《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(67)混元无极算素数 - 埃拉托斯特尼筛法
哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的数字大陆,大陆上布满了素数灵珠的谜题。大陆的入口处有一块巨大的石碑,上面刻着一行文字:“欲破此大陆,需以混元之力,算素数,埃拉托斯特尼筛法显真身。”
哪吒定睛一看,石碑上还有一行小字:“当n=10时,素数序列为[2, 3, 5, 7]
。”哪吒心中一动,他知道这是一道关于素数筛选的难题,需要通过埃拉托斯特尼筛法来解决。
暴力解法:数字大陆的初次尝试
哪吒心想:“要找出素数,我可以逐个检查每个数字是否为素数。”他催动混元之力,通过逐个检查每个数字是否能被小于其平方根的数字整除,试图找出所有的素数。
#include <vector>
#include <cmath>
using namespace std;
vector<int> findPrimes(int n) {
vector<int> primes;
for (int i = 2; i <= n; ++i) {
bool isPrime = true;
for (int j = 2; j <= sqrt(i); ++j) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
primes.push_back(i);
}
}
return primes;
}
哪吒成功地找出了素数,但数字大陆的光芒却黯淡了下来。他意识到,这种方法虽然可行,但效率低下,尤其是当n较大时,灵力消耗巨大。
C++语法点
在C++中,素数筛选涉及到位运算和向量操作。以下是一些重要特性:
- 平方根计算:
- 使用
sqrt()
函数计算平方根。
- 使用
- 向量操作:
- 使用
vector
类型存储素数。 - 使用
push_back()
方法添加元素到向量。
- 使用
高阶优化:埃拉托斯特尼筛法的智慧
哪吒元神中突然浮现金色铭文——「混元无极算素数,埃拉托斯特尼筛法显真身」。他意识到,可以通过埃拉托斯特尼筛法优化素数的筛选过程。
哪吒决定使用埃拉托斯特尼筛法,通过标记非素数来快速筛选出素数。通过这种方式,他成功地生成了素数序列,而且灵力消耗大幅减少。
#include <vector>