1、什么是完数(完美数)?
完数,一般指完全数,一个自然数如果它的所有真因子(即除了自身以外的约数)的和等于该数,那么这个数就是完全数,如:6的真因子有1 、2、3,6=1+2+3,所以6是一个完全数。
2、思路
1)首先由于完美数的定义,需要排除自身,所以数字 1一定不是完美数;
2)其次我们需要计算 num 除了它自身以外的所有正因子之和 sum,正因子必然是成对出现的,故而我们只需要遍历到 num 的平方根 sqrt 即可。
- 以 36 为例,它的非自身外正因子有,1、2、3、4、6、9、12、18,其中 1 和 6 单独计算,[2, 18]、[3, 12]、[4, 9]都是对应关系、
- 所以只需要遍历到 36 的平方根 6 就可以获取全部正因子。
- 1 单独计算的原因是要排除自身,6 单独计算的原因是 6 * 6 = 36,两个值相同,故而只能计算一遍。
3)时间复杂度:O(\sqrt{n}),n 为 num
的大小
3、JavaScript实现代码
let arr=[];
function checkPerfectNumber(val){
if(val == 1){
return false;
}
let sum = 1;// 正整数一定会有一个1,同时不用考虑自身,所以单独处理
let sqt=Math.sqrt(val);
for(let i=2;i<sqt;i++){
if(val % i === 0){
sum +=i;
sum +=val/i;//需要把当前因子对应的因子也加进来
}
// 此处单独处理的原因在于只需要加1次i值,如果在循环中会加2次
if(i * i == val) {
sum += i;
}
}
return sum ==val;
}
function findPerfectNumber(){
for(let j=1;j<1000001;j++){
if(checkPerfectNumber(j)){
arr.push(j);
}
}
console.info(arr)
}
findPerfectNumber();
本次运行后的输出的结果为:[6, 28, 496, 8128];
Tips:完美数只有 6, 28, 496, 8128, 33550336 这几个
参考资料:
作者:guanpengchn
链接:https://leetcode-cn.com/problems/perfect-number/solution/hua-jie-suan-fa-507-wan-mei-shu-by-guanpengchn/