完全数是等于其所有真因子(小于自身的正因数)之和的正整数;最小为6,1不是完全数;判断时需避免计入自身、重复计算平方根、遗漏1,遍历上限应为√n。

完全数的数学定义与判断逻辑
完全数是指一个正整数等于它所有真因子(即小于它自身的正因数)之和。比如 6 的真因子是 1、2、3,加起来正好是 6,所以它是完全数。
判断时不能只试到 n/2,那样效率低;更合理的上界是 sqrt(n),但要注意:每个找到的因子 i 对应另一个因子 n/i,且两者都得是真因子(即 != n)。
特别注意:1 没有真因子,和为 0,不是完全数;2 到 4 也都不是——最小的完全数是 6。
C++实现中容易漏掉的边界情况
写循环累加真因子时,常见错误包括:把 n 自身加进去、重复计入 sqrt(n)(当 n 是完全平方数时)、漏掉因子 1。
-
1必须显式加入(它是所有n > 1的真因子) - 遍历时从
2开始,上限设为sqrt(n)(用int i = 2; i * i 避免浮点误差) - 若
i整除n,且i != n/i,则两个都要检查是否为真因子(即) - 若
i == n/i(即完全平方),只加一次,且仍要确认i
简洁可靠的C++函数示例
下面这个 isPerfect 函数已覆盖上述所有要点,适用于 int 范围内(注意:已知偶完全数都形如 2^(p−1)(2^p − 1),但不用依赖该性质,直接算更通用):
bool isPerfect(int n) {
if (n 1 的真因子
for (int i = 2; i * i <p>测试 <code>isPerfect(28)</code> 返回 <code>true</code>,<code>isPerfect(12)</code> 返回 <code>false</code>。对大数(如接近 <code>INT_MAX</code>)要小心溢出,<code>sum</code> 建议用 <code>long long</code> 类型。</p><h3>性能与实际使用提醒</h3><p>完全数极其稀疏——前四个分别是 <code>6</code>、<code>28</code>、<code>496</code>、<code>8128</code>,第五个就超过 3300 万。所以暴力判断在 <code>n 内可行,再大就不现实了。</code></p><p>如果你只是验证几个小数,上面函数够用;但若需高频查询或范围筛查,硬算不如查表或用梅森素数生成法(不过那属于数论范畴,不在基础判断需求内)。</p><p>真正容易被忽略的是:<code>n</code> 为负数或零时行为未定义,调用前务必保证输入是正整数。</p>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











