【本文结构】题目信息:来源、地址、序号、描述
题目答案:简要分析,程序代码(测试运行通过,含注释),运行结果
霍霍磨刀:解答这道题目之前应掌握的知识基础
解析过程:题目类型,分析以及实践过程
斩获成果:通过解答这道题目之后的知识提升
下一题预告:来源、地址、序号、描述
【题目信息】
来源:菜鸟教程
序号:19
描述:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数
【题目答案】
程序代码:
from sys import stdout # 引入sys库中的stdout函数
for j in range(2, 1001): # 循环2到1000
k = [] # 定义列表k
n = -1 # 定义变量n,并赋初值-1
s = j # 定义变量s,并赋初值为j
for i in range(1, j): # 循环1到j之间
if j % i == 0: # 如果j取余i为0,表示能整除
n += 1 #n加1
s -= i # s减去i
k.append(i) # 将i放到k列表中
if s == 0: # 判断s是否为0
print(j) # 输出j
for i in range(n): # 循环n
stdout.write(str(k[i])) # 输出列表k中的每个值
stdout.write(' ') # 输出空格
print(k[n]) # 输出最后一个值
运行结果:
6
1 2 3
28
1 2 4 7 14
496
1 2 4 8 16 31 62 124 248
【霍霍磨刀】
在解答这道题目之前,你首先应具备以下知识基础:已掌握Python 练习实例12的解法
【解析过程】
题型:{语法实践题}
对于这道题目,我一般都是从简单入手,把题目分解成多步,并逐步解决
首先,我们应该了解什么是完数,由题可知,一个数如果恰好等于它的因子之和,这个数就称为"完数"
比如6就是完数,因为它的因子是1,2,3,加起来就是6
比如8不是完数,它的因子是1,2,4,加起来是7,不相等,所以不是
比如9不是完数,它的因子是1,3,加起来是4,不相等,所以不是
可能会觉得是废话,就是把题目复述了一遍,但其实不然,这是切题,也是熟悉题目
其次,我们要了解如何求因子,所谓因子,就是能整除,也就是余数为0,也就是取余为0,我写了一段小代码,代码如下:
# 如何找出一个数的因子
n=int(input("请输入一个数:")) # 输入一个数
for i in range(1,n): # 循环1到该数之间
if n % i ==0: #如果取余为0
print(i) # 那么该数就是因子
然后,判断该数是不是完数,有两种方法
一种是在找出因子的同时,该数减去因子,如果最后结果为0,那么该数是完数,代码如下:
for i in range(1,1001):
s=i
for j in range(1,i):
if i%j==0:
s-=j
if s==0:
print(i)
另外一种是求出所有因子,然后相加并与原数比较,相等则为完数,
for i in range(1,1001):
xlist=[]
for j in range(1,i//2+1):
if i % j==0:
xlist.append(j)
if sum(xlist)==i:
print(i)
print(xlist)
解答完毕,两个答案均可
比较:上述两段程序中,内循环的上限范围一个是i,一个是i//2+1,有什么差别,为什么要这么做?
答案:可以减少内循环次数,提高程序效率。上述两段程序中,第二个程序除了可以输出完数外,还可以输出该完数的因子,你能修改第一段程序,也输出完数的因子吗?答案:可以,参考最上面的答案
【斩获成果】
通过本题的解答,我们如何了如何用两种思路去解决求完数,这题其实和前面的第12题、第14题类似,我一般把它们归结为“在一定范围内找符合条件的数”
解答这类题,一般都是外循环控制范围,内循环控制条件,设置一个标记用来判断以及输出。
解答这类题,首先就是要能看懂题目,其次才是套用格式。
举一反三,抛出问题:找出1到10000以内的素数
找出1到1000以内的水仙花数
【下一题预告】
来源:菜鸟教程
序号:20
描述:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?