整段代码基本上是面向过程的函数式编程思维。。。
第一段自定义函数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,为下一次进入循环做准备