寻找完美数
对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。
给定一个 整数 n, 如果是完美数,返回 true,否则返回 false。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/perfect-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
其中,1 <= num <= 108
示例:
输入:num = 28
输出:true
解释:28 = 1 + 2 + 4 + 7 + 14
1, 2, 4, 7, 和 14 是 28 的所有正因子。
题解
按照题目要求来
用一个循环查找数字的因数,同时储存,最后比较因数和是否与原数字相同
代码:
var checkPerfectNumber = function(num) {
if(num === 1) return false;
let sum = 0;
for(let i=1;i<=Math.ceil(num/2);i++){
if(num%i === 0){
sum += i;
}
}
return sum === num;
};
但是,按照正常逻辑编写代码,效率很低,会很慢😭
因为测试中会有个变态案例:100000000
穷举法
按照题目要求,这个完美数
个数目前是有限的,而且题目限制 1 <= num <= 108 ,
所以测试案例中结果必定在 [6,28,496,8128,33550336]
范围里。
所以可以穷举所有可能啦~
使用集合:
var checkPerfectNumber = function(num) {
let all = new Set([6,28,496,8128,33550336]);
return all.has(num);
};
或者使用列表:
var checkPerfectNumber = function(num) {
let all = [6,28,496,8128,33550336];
return all.indexOf(num) !== -1;
};
又或者直接判断:
var checkPerfectNumber = function(num) {
return num === 6 || num === 28 || num === 496 || num === 8128 || num === 33550336;
};