实例019:完数
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
程序分析:
将每一对因子加进集合,在这个过程中已经自动去重。最后的结果要求不计算其本身。
代码复现:
# 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。# 什么是完数?# 如果一个数恰好等于它的真因子之和,则称该数为“完全数”。# 真因子(即除了自身以外的约数)import mathperfect_number = [] # 用来存放1000以内的 完数for num in range(2, 1001): # 思考:为什么从2开始? 而不是1开始? ---->根据完数定义,1的因数只有1,完数要真因子之和,要除去他本身,因此1不是完数factor = set() # 定义一个set集合 用来存放某个数的真因数 set() 无序不重复元素集for i in range(1, int(math.sqrt(num)) + 1): # 循环遍历求解得到每个数的因数 思考:这里为什么是int(math.sqrt(num)) + 1 而不是math.sqrt(num) + 1? ---> 因为range范围只能是整数if num % i == 0:factor.add(i)factor.add(num // i) # i是从小到大递增的,因此在前面增加了i时,同时可以把num//i也增加进去,因此我们在前面for循环时就不用循环到后面部分,只要到num//2就好了# factor.discard(num) # 除去他本身,因为在上面一行factor.add(int(num / i))增加时当i=1时会把他本身加进去factor.remove(num) # --->用discard删除时如果set中不存在该元素不会报错,但是remove就会报错。if sum(factor) == num:print('完数', num, '的真因子有:', factor)perfect_number.append(num)print(perfect_number)# 写法二# def factor(num):#num = int(num)#res = set()#for i in range(1, int(num / 2)):# if num % i == 0:# res.add(i)# res.add(num / i)## print(num,'--',res)#return res### for i in range(2, 1001):#if i == sum(factor(i)) - i: # -i就是要去掉他本身,即所谓真因子# print(i)
运行结果:
完数 6 的真因子有: {1, 2, 3}完数 28 的真因子有: {1, 2, 4, 7, 14}完数 496 的真因子有: {1, 2, 4, 8, 16, 248, 124, 62, 31}[6, 28, 496]Process finished with exit code 0
实例019:完数 一个数如果恰好等于它的因子之和 这个数就称为“完数“。例如6=1+2+3.编程找出1000以内的所有完数。
如果觉得《实例019:完数 一个数如果恰好等于它的因子之和 这个数就称为“完数“。例如6=1+2》对你有帮助,请点赞、收藏,并留下你的观点哦!