完数是等于除自身外所有正因子之和的正整数;例如6的因子1、2、3之和为6。高效判断需遍历至√n,加入i及n/i(排除n自身),避免重复与遗漏。
什么是完数?先看判断逻辑
完数(完全数)是指一个正整数,它等于**除自身以外的所有正因子之和**。比如 6 的因子是 1, 2, 3(不包括 6),而 1 + 2 + 3 == 6,所以它是完数。
关键点在于:因子必须是「能整除该数的正整数」,且**不包含自身**;求和后严格等于原数才算完数。
如何高效找因子并避免重复或遗漏
暴力遍历 1 到 n-1 虽然可行,但对大数(如 10^6 以上)太慢。更优做法是只遍历到 sqrt(n):
- 对每个能整除
n的i(i != n),把i加入因子和 - 如果
i != n / i且n / i != n,再把n / i加入(避免重复加平方根,也排除自身) - 特别注意:永远跳过
n自身,哪怕它在因子对中出现(例如n=4,i=2时n/i==2,不能加两次,也不能加4)
bool isPerfect(int n) {
if (n 1 时),且不是自身
for (int i = 2; i * i <= n; ++i) {
if (n % i == 0) {
sum += i;
if (i != n / i && n / i != n) { // 防止加自身,也防平方根重复
sum += n / i;
}
}
}
return sum == n;
}
常见错误与边界情况
写错的地方往往不是算法主干,而是边界处理:
立即学习“C++免费学习笔记(深入)”;