背景知识
完美数是除了自身外,所有真因子之和等于自身的自然数。
我们寻找完美数的方法就是遍历,只是可以通过以下特点,减少遍历次数:
- 一个数的真因子一定小于等于自身的一半
- 而由于真因子一定是成对出现的(除1*本身以外,我们只取1),所以我们只需要遍历2到
之间的数即可找完所有真因子
代码如下:
import sys
for n in sys.stdin:
n = int(n)
count = 1 # 1是完美数且n>0,则最少有一个完美数
# 遍历2到n之间的所有数
for i in range(2, n):
# 一个数的真因子只可能在1到该数的1/2之间,由于整除一次能找到两个真因子,故遍历1到该数的平方跟之间,一定能找完
sub = 1 # sub为真因子之和,由于1一定是真因子,故初始为1
for j in range(2, int(pow(i, 1/2))):
if i % j == 0: # 如果j能整除,则是j和整除的数字都是真因子
sub += j + i/j
if sub == i:
count += 1
print(count) 
京公网安备 11010502036488号