LeetCode每日一题 - 507. 完美数

该博客讨论了如何高效地判断一个正整数是否为完美数。通过两种方法进行对比,一是传统的循环查找因子,二是利用已知完美数列表进行穷举。针对LeetCode上的问题,对于1到10^8的范围,使用穷举法可以显著提高代码执行效率,避免了对大数的因子遍历。这种方法在处理大数值时更为实用。
摘要由CSDN通过智能技术生成

寻找完美数

对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。
给定一个 整数 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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值