寻找完全数算法的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 欢迎交流

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐