函数 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;
}逻辑代数运算:与(∧/×)、或(∨/+)、非(┐/¬)。德摩根律:┐(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,就变成素数判断。刷到类似题先问自己:命题人想考我什么?是效率还是逻辑?