返回<=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节