菜鸟IT的博客 >> Python
自己折腾学习自定义函数来找1000以内的完数,程序运算效率极低,算好久。哈哈哈。但是好歹是自己初学写出来。
# -*- coding: UTF-8 -*-
from functools import reduce
# 测试自己写1个函数工具,来求1000以内的完数。
# 先自定义1个函数,参数是数字,返回的这个数字的所有因数的1个数字列表
# 所有的因数:包含这个数自己在内
def AllYinShu(n):
list1 = [i for i in range(1, n+1)]
list2 = list1[::-1]
list3 = []
for a in list1:
for b in list2:
if a * b == n:
list3.append(a)
return list3
# 来一波循环测试打印,看看10以内的全部因数列表。
for AYStest in range(1,10+1):
print("第",AYStest,"次测试:",AYStest,"以内的全部因数列表:",AllYinShu(AYStest))
AYStest=AYStest+1
# 打印分割线
print("*"*50)
# 求全部因数的效果很好。现在要排除掉只有2个因子的情况的数。
# 某个数的全部因数去掉它本身,还能有2个。
# 因为所有数的因数肯定包含他本身。但是因子不能算上它自己。
# 也就是某个数的全部因数的数量大于或等于3.才再我们考虑的范围内。
# 开始找完数,某个数的全部因数相加的和除以2,等于这个因数。
# 那么这个数就是完数。
JiShu=0
for xxx in range(1,1000+1):
AYSZongHe=reduce(lambda x, y: x+y, AllYinShu(xxx))
if(xxx*2==AYSZongHe):
JiShu=JiShu+1
print("找到第",JiShu,"个完数:",xxx)
————————
输出结果:(找完数的时候,等了好几秒,哈哈)
第 1 次测试: 1 以内的全部因数列表: [1]
第 2 次测试: 2 以内的全部因数列表: [1, 2]
第 3 次测试: 3 以内的全部因数列表: [1, 3]
第 4 次测试: 4 以内的全部因数列表: [1, 2, 4]
第 5 次测试: 5 以内的全部因数列表: [1, 5]
第 6 次测试: 6 以内的全部因数列表: [1, 2, 3, 6]
第 7 次测试: 7 以内的全部因数列表: [1, 7]
第 8 次测试: 8 以内的全部因数列表: [1, 2, 4, 8]
第 9 次测试: 9 以内的全部因数列表: [1, 3, 9]
第 10 次测试: 10 以内的全部因数列表: [1, 2, 5, 10]
**************************************************
找到第 1 个完数: 6
找到第 2 个完数: 28
找到第 3 个完数: 496
进程已结束,退出代码0
菜鸟IT博客[2022.01.23-00:14] 访问:358