实例019:完数 一个数如果恰好等于它的因子之和,这个数就称为“完数“。例如6=1+2+3.编程找出1000以内的所有完数。
原创
©著作权归作者所有:来自51CTO博客作者lanxiaofang的原创作品,请联系作者获取转载授权,否则将追究法律责任
实例019:完数
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
程序分析:
将每一对因子加进集合,在这个过程中已经自动去重。最后的结果要求不计算其本身。
代码复现:
# 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
# 什么是完数?
# 如果一个数恰好等于它的真因子之和,则称该数为“完全数”。
# 真因子(即除了自身以外的约数)
import math
perfect_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