持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
一、题目描述:
对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。
给定一个 整数 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)