实现代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Filename: perfect.py
from math import sqrt, floor
def is_factor(factor, num):
return num % factor == 0
def add_factors(factor, num):
s = factor
if int(num / factor) != factor:
s += int(num / factor)
return s
def cal_aliquot_sum(num):
sum = 1
for i in range(2, int(floor(sqrt(num))) + 1):
if (is_factor(i, num)):
sum += add_factors(i, num)
return int(sum)
def aliquot_sum(num):
sum = 0
if (num > 0):
sum = cal_aliquot_sum(num)
return sum
def is_perfect(num):
return aliquot_sum(num) == num
测试代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Filename: test_perfect.py
import unittest
from perfect import *
'''
' 1. I need judge if a number is a factor
' 2. I need the sum of aliquot sum of a num
' 3. I need judge if a number is perfect
'''
class PerfectNumTestCase(unittest.TestCase):
def setUp(self):
self.PERFECT_NUMS = [6, 28, 496, 8128, 33550336]
return
def tearDown(self):
return
def test_1_is_factor_of_10(self):
self.assertTrue(is_factor(1, 10))
def test_10_is_factor_of_10(self):
self.assertTrue(is_factor(10, 10))
def test_3_is_not_factor_of_10(self):
self.assertFalse(is_factor(3, 10))
def test_aliquot_sum_for_6(self):
self.assertEqual(6, aliquot_sum(6))
def test_aliquot_sum_for_28(self):
self.assertEqual(1 + 28 + 2 + 14 + 4 + 7 - 28, aliquot_sum(28))
def test_aliquot_sum_for_16(self):
self.assertEqual(1 + 16 + 2 + 8 + 4 - 16, aliquot_sum(16))
def test_aliquot_sum_for_negative(self):
self.assertEqual(0, aliquot_sum(-20))
def test_is_perfect(self):
for num in self.PERFECT_NUMS:
self.assertTrue(is_perfect(num))
def test_is_non_perfect(self):
for num in (2, 10000):
if self.PERFECT_NUMS.count(num) > 0:
self.assertTrue(is_perfect(num))
else:
self.assertFalse(is_perfect(num))
if __name__ == "__main__":
unittest.main()
测试报告: