We define the Perfect Number is a positive integer that is equal to the sum of all its positive divisors except itself.
Now, given an integer n, write a function that returns true when it is a perfect number and false when it is not.
Example:
Input: 28
Output: True
Explanation: 28 = 1 + 2 + 4 + 7 + 14
Note: The input number n will not exceed 100,000,000. (1e8)
Approach one :Brute Force(Time Limit exceeded)
def checkPerfectNumber(self, num):
"""
:type num: int
:rtype: bool
"""
if num <= 0:
return False
sum = 0
for i in range(1,num):
if num % i == 0:
sum += 1
return sum==num
Approach two:Optimal Solution [Accepted]
Why square root as the upper limit?
sqrt(x) * sqrt(x) = x
. So if the two factors are the same, they're both the square root. If you make one factor bigger, you have to make the other factor smaller. This means that one of the two will always be less than or equal to sqrt(x)
, so you only have to search up to that point to find one of the two matching factors. You can then use x / fac1
to get fac2
.
def checkPerfectNumber(self, num):
"""
:type num: int
:rtype: bool
"""
if num <= 0:
return False
sum = 0
m = pow(num,0.5)
for i in range(1,int(m+1)):
if num % i == 0 and i != 1:
div = num / i
sum += i
sum += div
elif i == 1 and num!=1:
sum += 1
return sum==num