【leetcode】507.Perfect Number
阿新 • • 發佈:2018-04-04
log 我們 技術分享 sel span inf break 思路 排除
題目如下:
解題思路:因為n的最大值是1e8,所以暴力計算是不行的。首先,我們可以排除掉素數,因為素數的整數因子只有1和自己本身,所以累加的和肯定是1。對於非素數,我們首先找到它的最小整數因子,例如28,最小整數因子是2,表示[2,14]是其中一對整數因子;接下來對較大的那個整數因子繼續做最小整數因子的分解,14表示成[2,7],再用上一次分解中較小的整數因子乘以本次分解中較小的整數因子,就是第二對整數因子,這裏是[2*2,7],而後繼續分解較大的整數因子,只到無法被分解為止(即這個數是素數為止)。到這裏就可以得到這個整數的所有整數因子對,求和即可,註意不要忘了加上數字1。
代碼如下:
importmath class Solution(object): def is_prime(self,num): if num == 1 or num == 2: return True for i in range(2, int(math.sqrt(num) + 1)): if num % i == 0: return False return True def checkPerfectNumber(self, num): if num < 0 ornum == 1: return False v1 = 1 v2 = num count = 1 while self.is_prime(v2) == False: tmp = v2 tmp1 = v1 j = 1 while j < tmp: j += 1 if tmp % j == 0: v1 = min(j, tmp / j) v2= max(j, tmp / j) v1 = tmp1 * v1 count += v1 count += v2 break return count == num
【leetcode】507.Perfect Number