日新计划507. 完美数

95 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

一、题目描述:

507. 完美数 - 力扣(LeetCode)

对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。

给定一个 整数 n, 如果是完美数,返回 true;否则返回 false。

示例 1:

输入:num = 28
输出:true
解释:28 = 1 + 2 + 4 + 7 + 14
1, 2, 4, 7, 和 14 是 28 的所有正因子。

示例 2:

输入:num = 7
输出:false

提示:

  • 1 <= num <= 10^8

二、思路分析:

可以发现这样一个规律,如24的因子为1,2,3,4,6,8,12,24,我们只需要找到1,2,3,4这四个数,就可以通过num/i的方式找出所有的因子,我称这四个因子为小因子,称num/i得到的因子为大因子,那么大因子和小因子的分割线正好是num**0.5,所以通过这个规律可以大幅度减小时间复杂度。

此外,还需要注意,这题有两个陷阱:(1)完美数的定义是在正整数范围内的,但这里给的是整数,因此需要排除负整数的情况;(2)正整数1,它并不是完美数

三、AC 代码:

class Solution {
    public boolean checkPerfectNumber(int num) {
        int sqrt_num=(int)Math.sqrt((double)num);
        int sum=1;
        for (int i=2;i<sqrt_num;i++){
            if(num%i==0){
                sum+=i;
                sum+=num/i;
            }
        }
        if(num%sqrt_num==0){
            sum+=sqrt_num;
            if(num/sqrt_num!=sqrt_num)
                sum+=num/sqrt_num;
        }
        return sum==num? true:false;
    }
}

范文参考

视频清晰,第一个徽章开心!转码,纪念一下我的12月!!! - 完美数 - 力扣(LeetCode)

Rust/Golang/Java 打表/暴力枚举优化 100%击败 - 完美数 - 力扣(LeetCode)

小小一步,可以避免时间超限(然并卵) - 完美数 - 力扣(LeetCode)

2ms解法,(快速求出一个数的所有因子和的方法) - 完美数 - 力扣(LeetCode)