1、完数的定义【引用百度百科对完数的定义】:
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
如果一个数恰好等于它的真因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。截至2018年,相关研究者已经找到51个完全数
2、先定义一个函数,用于判断一个数是否是完数。然后再用for循环进行函数调用
# 判断一个数是否是完数
def fun1(number):
b = []
for i in range(1, number):
if number % i == 0:
b.append(i)
if sum(b) == number:
print("%d = " % number, end="")
for j in b:
print(j, end=" ")
print("\r")
# 进行循环判断
for i in range(1, 1000):
fun1(i)
执行结果如下:
6 = 1 2 3
28 = 1 2 4 7 14
496 = 1 2 4 8 16 31 62 124 248
问题来了,在循环遍历列表时,打印出列表中的每个元素后,加了一个 " ",在获取列表最后一个元素时。“ ”自然而然的也打印出来了,因此需要寻找一种方法,不打印最后的“ ”,于是可以判断列表的长度,打印到最后一个元素时,直接输出,不打印“ ”。但是这样做会影响程序的执行效率,最后再比较一下。
3、修改后的完整程序
# 判断一个数是否是完数
def fun1(number):
b = []
for i in range(1, number):
if number % i == 0:
b.append(i)
if sum(b) == number:
print("%d = " % number, end="")
for j in b:
if b.index(j) != len(b) - 1:
print(j, end=" ")
else:
print(j)
# 进行循环判断
for i in range(1, 1000):
fun1(i)
程序的运行结果:
6 = 1 2 3
28 = 1 2 4 7 14
496 = 1 2 4 8 16 31 62 124 248
这样程序就比较完美了
4、程序的执行时间:【为啥?为啥?为啥?哪位朋友帮忙答疑解惑:在for中调用if进行判断的执行时间为啥会短】
第一组数据:10000以内
0:00:02.215864 在for循环中调用if判断
0:00:02.313698 在for循环中不调用if判断
第二组数据:100000以内
0:04:37.690211 在for循环中调用if判断
0:06:05.017396 在for循环中不调用if判断
python实现寻找完数