用Python求完美数

整段代码基本上是面向过程的函数式编程思维。。。

第一段自定义函数Is_perfNum是用来判断是否为完美数的,引用 一下某度百科的完美数的定义:

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。 

思路: 

我们可以通过取余得零来找出一个数的所有真因子,再将这些真因子求和看是否等于这个数。

这样就可以判断这个数是否是完美数了。

 

第二段自定义函数flag():

我想实现这样一个功能,即当计算出一个完美数后,系统询问你是否要继续计算下一个完美数。

因此自定义了flag函数用于判断是否继续生成。

思路:

双层while循环就可以搞掂了,最外层循环条件为键盘键入Y/N。

内层循环条件为是否是完美数。

这样当程序跳出内层循环时,就会判断是否继续外层循环,这时候就可以提醒你键入Y/N啦

 

最后主函数部分:

变量 i 即为需要判断是否完美的数,每次循环过后会进行自加。

 

需要注意的是,在外层循环的最后一句也需要进行一次 i 的自加。

因为当 i 为完美数时,内层循环中的 i = i + 1不会被执行,因此 i 的值始终是完美数的值。

这样的话,当第一次求得完美数之后,i 始终不满足内层循环的条件,就无法继续生成接下来的完美数了。

所以,为了下一次运算做准备,在外层循环的最后一句也需要进行一次 i 的自加。

 

行文啰嗦。。。

直接上代码好了。。。

# -*- coding: utf-8 -*-

'求完美数'
import os

def Is_PerfNum(x):      #判断x是否是完美数
    L = []  # 创建列表存储因子
    for n in range(1,x):    # 找出一个数的所有因子
        if x % n == 0:
            L.append(n)
    if sum(L) == x:     # 列表求和判断完美数
        print('%s is perfect number.'%x)
        return True
    else:
        return False


def flag(): # 判断是否继续
    print('Continue? (Y/N)')
    YN = str.upper(str(input()))    # 把输入的字符先转化为string,然后再全变为大写
    if YN =='Y':
        return True
    elif YN =='N':
        print('Exiting program!')
        os.system("pause")
        return False  
    else:
        print("Error, wrong character!")
        return False

if __name__=='__main__':

    i = 1
    while(flag()):
        while(not Is_PerfNum(i)):
            i = i + 1       # 不是完美数时,i + 1 测试下一位数
        i = i + 1       # 是完美数时,跳出内循环并 i + 1,为下一次进入循环做准备

 

你可能感兴趣的:(Python学习日志)