菜鸟IT的博客 >> Python
多线程并发找完数 | from concurrent.futures import ThreadPoolExecutor | ThreadPoolExecutor
# -*- coding:utf-8 -*-
import time
# 导入库,用于求:数组(数字列表)的数字相加之和
from functools import reduce
# 导入线程池有关的库
from concurrent.futures import ThreadPoolExecutor
import datetime
# 记录开始时间
starttime = datetime.datetime.now()
import threading
# 完数就是:某个数的所有因数(除了这个数本身)相加之和,等于这个数本身
# 写1个函数,求某个数字的所有因数。首先1个规律,因数肯定小于这个数的1半。
# 而且因数肯定从1开始,肯定大于1,包含1本身
def ZhaoYinShu(m):
YinShuList=[]
# 遍历查找因数范围,
for i in range(1,m//2+1):
# 如果i能被m整除,那么i就是m的因数,然后就加入因数列表。
if(m%i==0):
YinShuList.append(i)
return YinShuList
# 测试找某个数的全部因数
print("测试查找某个数(比如100)的全部真因数(不包含这个数本身)",ZhaoYinShu(100))
# 求这个数的所有因数之和,测试100这个数字的全部真因数之和。
AllTrueYinShuZhiHe=reduce(lambda x,y:x+y,ZhaoYinShu(100))
print("测试查找某个数(比如100)的全部真因数之和:",AllTrueYinShuZhiHe)
print("#"*50)
# 定义1个函数,判断某个数是否“完数”。
def FindWanShu(fff):
YinShuHe=0
for j in ZhaoYinShu(fff):
YinShuHe=YinShuHe+j
if(fff==YinShuHe):
return fff
else:
return 0
# 定义1个输入项
numFanWei=int(input("输入1个整数代表你想查找完数的数字范围:"))
numFanWei_List=[]
for i in range(1,numFanWei+1):
numFanWei_List.append(i)
# 定义1个最大容纳数量为50的线程池
with ThreadPoolExecutor(max_workers=100) as pool:
WanShuList=pool.map(FindWanShu,numFanWei_List)
for WanShu in WanShuList:
if(WanShu!=0):
print("找到完数:",WanShu,"。成功时间:",time.strftime('%Y{}%m{}%d{} %H{}%M{}%S{}',time.localtime()).format("年","月","日","时","分","秒"))
# 结束时间
endtime = datetime.datetime.now()
# 输出程序运行时间
print("找到全部完数消耗的时间:",(endtime - starttime).seconds,"秒。")
————————————
输出结果:
测试查找某个数(比如100)的全部真因数(不包含这个数本身) [1, 2, 4, 5, 10, 20, 25, 50]
测试查找某个数(比如100)的全部真因数之和: 117
##################################################
输入1个整数代表你想查找完数的数字范围:10000
找到完数: 6 。成功时间: 2022年02月06日 20时08分19秒
找到完数: 28 。成功时间: 2022年02月06日 20时08分19秒
找到完数: 496 。成功时间: 2022年02月06日 20时08分19秒
找到完数: 8128 。成功时间: 2022年02月06日 20时08分19秒
找到全部完数消耗的时间: 11 秒。
Process finished with exit code 0
菜鸟IT博客[2022.02.06-20:09] 访问:252