对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。
给定一个 整数 n, 如果是完美数,返回 true;否则返回 false。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/perfect-number
例:
输入:num = 28 输出:true 解释:28 = 1 + 2 + 4 + 7 + 14 1, 2, 4, 7, 和 14 是 28 的所有正因子。
解析:
使用枚举法,我们可以一个值一个值的判断,然后将满足条件的值统统加起来即可。但是如果一一判断的话,时间复杂度过高,最后编译时会超时,所以我们在枚举值要尽可能的少判断一些值,比如我们最大判断值是num的开方,因为如果有存在大于这个值的值满足条件,那么num除以他另一个值一定是小于num的开方,我们在判断小于num的开方值时可以顺便将大于num的开方的值一并加入,这样可以大大减少消耗的时间。
class Solution(object):
def checkPerfectNumber(self, num):
"""
:type num: int
:rtype: bool
"""
if num == 1:
return False # 因为不能包括自身
sum = 1 # 1肯定满足条件
f = 2 # 开方因子
while f * f <= num: # 不越界
if num % f == 0: # 满足条件
sum += f # 将满足条件的值进行总和
if f * f < num:
sum += num / f # 将另一个大一些的值一并加入,优化时间复杂度
f += 1
return sum == num