# 第23期-完数

Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。

# 1 问题描述

求某一范围内的所有完数。
或者输入一个数,判断其是不是完数。
如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”)。例如,6的因子为1、2、3,而 6=1+2+3,因此6是“完数”。

# 2 解题思路

根据完数的定义,解决本题的关键是计算出所选取的整数i(i的取值范围不固定)的因子(因子就是所有可以整除这个数的数),将各因子累加到变量s (记录所有因子之和),若s等于i,则可确认i为完数,反之则不是完数。

判断是否是完数
第一步: 输入一个数,input函数
第二步: 从1开始遍历到输入的数(不包括数本身),判断是否是其因数,for循环
第三步: 累加法,判断是否相等

输出某一范围内的所有完数
第一步: 定义范围并遍历范围内的所有数,for或while循环
第二步: 从1开始遍历到数(不包括数本身),判断是否是其因数,for循环
第三步: 累加法,判断是否相等

# 3 解题方法

# 判断完数

pnum = int(input('请输入一个数:'))
cum = 0
for i in range(1, pnum):
    if pnum % i == 0:
        cum += i
if pnum == cum:
    print(f'{pnum}是完数')
else:
    print(f'{pnum}不是完数')
1
2
3
4
5
6
7
8
9

第1行: input函数输入一个值并用int函数将其转换为整数类型,返回值到pnum变量
第2行: 定义变量cum,初始值为0,用于累计因子的和
第3行: 使用for循环遍历小于pnum的所有整数
第4-5行: 分别判断小于pnum的值是否为其因子,若是,则加到cum上
第6-9行: 判断因子和是否与原数相等,若是,用print函数打印其是完数,若不是,用print函数打印其不是完数

代码运行结果为:
image.png

# 输出完数

pnum = []
for i in range(1, 1001):
    cum = 0
    for j in range(1, i):
        if i % j == 0:
            cum += j
    if i == cum:
        pnum.append(str(i))
print('1000以内的完数有这些:', ','.join(pnum))
1
2
3
4
5
6
7
8
9

第1行: 定义所有完数的集合列表pnum
第2行: 用for循环遍历1-1000的所有值,以输出这范围内的所有完数
第3行: 定义变量cum,初始值为0,用于累计因子的和
第4行: 使用for循环遍历小于i的所有整数
第5-6行: 分别判断小于i的值是否为其因子,若是,则加到cum上
第7-8行: 判断因子和是否与i相等,若是,则将i的值加到列表pnum的末尾
第9行: 输出1000以内的所有完数并用英文的逗号隔开

代码运行结果为:
image.png

这里用到了join函数,简单讲解下这个函数:
string.join()函数
Python中有join()和os.path.join()两个函数,具体作用如下:
join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
os.path.join(): 将多个路径组合后返回
语法:
'sep'.join(seq)
参数说明:
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典

例如:代码:
seq4 = ('hello','good','yes','doiido')
print ':'.join(seq4)
输出:hello:good:yes:doiido

# 小思考

不知道各位小伙伴们有没有发现,上下两种方法cum = 0的位置不一样,上面cum = 0的位置在for循环之外,而下面cum = 0的位置在两个循环之间,这又是什么原因呢?

这是因为上面的判断完数中,cum的值一次代码运行只需要确定一次,而下面的输出所有完数中,对于所有小于1000的数,都需要使用到cum,所以每次循环,都需要将cum的值重新赋值为0。

# 4 视频解析

高清视频讲解,请查看AI大学堂Python基础实战100例 (opens new window)
关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
AI大学堂公众号.png

更新于: 12/28/2021, 7:43:14 AM