GESP 五级 · GESP 202509 C++ 五级 第 4 题

选择题 · 答案 B · 考点:循环结构

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

题目

函数 isPerfectNumber 判断一个正整数是否为完全数(该数是否即等于它的真因子之和),则横线上应填写( )。一个正整数 $n$ 的真因子包括所有小于 $n$ 的正因子,如 $28$ 的真因子为 $1, 2, 4, 7, 14$。

bool isPerfectNumber(int n) {
    if(n <= 1) return false;
    int sum = 1;
    for(int i = 2; ______; i++) {
        if(n % i == 0) {
            sum += i;
            if(i != n/i) sum += n/i;
        }
    }
    return sum == n;
}
答案:B

考点

循环结构

解题思维

逻辑代数运算:与(∧/×)、或(∨/+)、非(┐/¬)。德摩根律:┐(A∧B)=┐A∨┐B,┐(A∨B)=┐A∧┐B。

常见错误

注意德摩根律的正确应用:┐(A∧B)=┐A∨┐B,┐(A∨B)=┐A∧┐B。C++中逻辑运算符有短路求值特性。

详细解析(节选)

【考点】循环结构优化|完全数判定逻辑|平方根遍历思想

🎯 考纲定位(考点定位) 五级函数题特意卡住对因子成对性的理解,循环边界条件写成 i*i <= n 是经典陷阱。命题人想考你:看到 sum += n/i 就立刻意识到只需遍历到 $\sqrt{n}$,这是五级对算法效率的考查。

🧠 解题思维(拆解与通法) 关键观察是 sum += n/i 暴露了因子成对性,只需遍历到 $\sqrt{n}$。用 i*i <= n 是整数域里最紧凑的写法,避免调用 sqrt() 函数,符合五级对算法效率的考查。

🪤 陷阱拆解(命题人的套路) 选 A 是暴力思维,选 C 会重复累加 $n/i$(如 $n=28$ 时 $i=14$ 已计入,$n/14=2$ 又加一次),选 D 只是把范围缩了一点点,但逻辑错误没变。题目里 i != n/i 这个判断是防止平方数重复,但循环边界必须配合它,否则前面已经多加了。

🔄 反命题思维(教练升华) 反命题视角:若把 sum 改成计数 cnt++,就是求因子个数,条件不变;若改成 return sum == 1 且初始 sum=0,就变成素数判断。刷到类似题先问自己:命题人想考我什么?是效率还是逻辑?

同考点真题

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