寻找完全数算法的Python实现
问题:
要找一个完全数的解决思路是:
找出一个数的所有因数,验证这些因数的和是否等于这个数,如果等于,就是完全数。
Python代码:
#!/usr/bin/env python
#coding:utf-8
def factors(n):
#return [i for i in range(1,n/2+1) if n%i == 0]
# 如果仅仅是为了得到因数,可以用上面的
# 如果是配合下面完全数,最好使用下面的。因为在下面少循环一次,1肯定是任何整数的因数
return [i for i in range(2,n/2+1) if n%i == 0]
#找出某个数n以内的所有完全数,即在[1,n]内(含n)
def perfect(n):
#从上面的factors中得到的因数列表中,少1,因此在求因数和的时候,要把1加上。
return [i for i in range(2,n+1) if (sum(factors(i))+1)==i]
if __name__=="__main__":
print perfect(1000)
print factors(1000)
优点:
编写两个函数,一个求因数,一个求完全数,方便检查错误和修改代码。这样可以重复使用 i 和 n 两个字母,i 是循环量,n 是总数,增加了代码的易读性。
改进:
因为完全数一定不是质数,在进入求因数函数前增加一个质数判断的语句,希望可以减少代码运行时间。用timeit模块来输出代码运行时间。代码如下:
def perfect_num(n):
for i in range(2,n+1):
if factors(i)!= []:
return [i for i in range(2,n+1) if (sum(factors(i))+1)==i]
输出运行时间,以n=10为例。
import timeit
print (timeit.timeit("perfect(10)",setup= "from __main__ import perfect"))
print (timeit.timeit("perfect_num(10)",setup="from __main__ import perfect_num"))
个人邮箱:lq@mpig.com.cn 欢迎交流