完全数是等于其所有真因子(小于自身的正因数)之和的正整数;最小为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。
立即学习“C++免费学习笔记(深入)”;
-
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) return false;
int sum = 1; // 1 是所有 n>1 的真因子
for (int i = 2; i * i <= n; ++i) {
if (n % i == 0) {
if (i < n) sum += i;
int other = n / i;
if (other != i && other < n) sum += other;
}
}
return sum == n;
}测试 isPerfect(28) 返回 true,isPerfect(12) 返回 false。对大数(如接近 INT_MAX)要小心溢出,sum 建议用 long long 类型。
性能与实际使用提醒
完全数极其稀疏——前四个分别是 6、28、496、8128,第五个就超过 3300 万。所以暴力判断在 n 内可行,再大就不现实了。
如果你只是验证几个小数,上面函数够用;但若需高频查询或范围筛查,硬算不如查表或用梅森素数生成法(不过那属于数论范畴,不在基础判断需求内)。
真正容易被忽略的是:n 为负数或零时行为未定义,调用前务必保证输入是正整数。


















