下面代码实现了欧拉(线性)筛,横线处应填写( )。
vector<int> euler_sieve(int n) {
vector<bool> is_composite(n + 1, false);
vector<int> primes;
for (int i = 2; i <= n; i++) {
if (!is_composite[i])
primes.push_back(i);
for (int j = 0; _________________________ && (long long)i * primes[j] <= n; j++) {
is_composite[i * primes[j]] = true;
if (i % primes[j] == 0)
break;
}
}
return primes;
}STL 容器:vector(动态数组)、set/map(红黑树,有序)、unordered_set/map(哈希表,无序)。注意迭代器失效问题。
填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。
【考点】线性筛|素数判定|数组边界控制
GESP五级《C++程序设计》算法模块第3章"筛法求素数"。命题人卡住的是考生对线性筛核心逻辑的掌握——知道要筛,但不知道筛到什么程度。90%的考生会凭直觉选B(sqrt(n))或D(i),只有真正理解"每个合数只被其最小质因数筛一次"的人才能选对。