返回<=n的所有質數
// 埃拉托色尼的篩子
vector<int> sieve(int n) {
vector<int> nums, result;
for (int i = 0; i <= n; ++i)nums.emplace_back(i);
for (int i = 2; i < pow(n, 0.5); ++i) {
for (int j = i * i; j <= n; j += i)nums[j] = 0; //(i-1)*i、(i-2)*i的下標在之前已經判斷過了
}
for (int i = 2; i <= n; ++i) {
if (nums[i] != 0)result.emplace_back(nums[i]);
}
return result;
}
Reference
- 《算法設計與分析基礎》1.1節