GESP 五级 · GESP 202506 C++ 五级 第 18 题

判断题 · 答案 B

← 整套速查表 GESP 五级 全部真题

题目

下面的 C++ 代码用于输出每个数对应的质因数列表,输出形如:{5: [5], 6: [2, 3], 7: [7], 8: [2, 2, 2]}。

int main() {
    int n, m;
    cin >> n >> m;
    if (n > m) swap(n, m);
    map<int, vector<int>> prime_factor;

    for (int i = n; i <= m; ++i) {
        int j = 2, k = i;
        while (k != 1) {
            if (k % j == 0) {
                prime_factor[i] = prime_factor[i] + j;
                k /= j;
            } else {
                ++j;
            }
        }
    }

    for (auto& p : prime_factor) {
        cout << p.first << ": ";
        for (int v : p.second)
            cout << v << " ";
        cout << endl;
    }

    return 0;
}
答案:B

解题思维

STL 容器:vector(动态数组)、set/map(红黑树,有序)、unordered_set/map(哈希表,无序)。注意迭代器失效问题。

常见错误

审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。

详细解析(节选)

【考点】C++ map 复合赋值|vector 类型匹配

考纲定位:本题直击 GESP 五级 C++ 标准库核心——map 复合赋值运算符的行为边界。命题人故意把这道题放在试卷里,就是卡住那些只背"map 可以用 += "结论,却不理解其类型约束的考生。

解题思维:看到 prime_factor[i] = prime_factor[i] + j 先反应:+= 是复合赋值,但 += 的右操作数必须是 map 的 value_type。关键观察:prime_factor[i] + j 是 vector<int> 的加法(返回 vector),而 map 的 += 只接受 vector,不接受 int。推理依据:C++ 标准库的 map 迭代器与赋值重载规则。这一类题的通法是:遇到 map/set 的复合赋值时,先确认右操作数类型是否与 map 的 value_type 完全匹配。

陷阱拆解:选项 A 是命题人精心设计的"正确"诱饵。错误点在于:prime_factor[i] + j 是 vector 加法,返回 vector,但 map 的 += 只接受 vector,不接受 int。最阴险的细节是"偷换类型"——把 int 包装成 vector 却仍用 += 赋值,看似合理实则违背重载规则。如果你只背结论、不理解本质,就会掉进这个陷阱。

反命题思维:如果把代码改成 prime_factor[i] += {j},就会正确累加,因为 {j} 是 vector 的初始化列表,符合 += 要求。刷题时先问自己:map 的复合赋值到底接受什么类型?

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断