这是少儿编程趣味数学系列教程的第二篇,讨论如何通过编程的方式判断一个自然数是否为完美数(完全数)。
什么叫完美数/完全数?
完美数(Perfect number),又称完全数或完备数,是一些特殊的自然数:它所有的真因子(即除了自身以外的因数)的和,恰好等于它本身。例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3,恰好等于6本身。第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14,也恰好等于28本身。
完全数最早是由古希腊数学家欧几里得发现的。

使用Python判断一个自然数是否为完全数
我们可以用一种直接的方式来判断一个自然数是否为完全数:
- 首先求出该自然数除自身之外的所有因数
- 将所有因数相加,得到和
- 将因数相加得到的和和自然数本身进行比较,如果相等,则为完美数,否则,不是完美数。
下面是Python代码:
# 判断一个数是不是完美数
n = int(input("输入一个自然数:"))
# 求出除自身外的所有因数
def get_factors(n):
factors = []
for i in range(1, n//2+1): #想想这里的范围为什么是1-n//2+1
if(n % i == 0):
factors.append(i)
return factors
factors = get_factors(n)
# 求出所有因数(自身除外)的和
sm = 0
for j in factors:
sm += j
if(sm == n):
print(n, "是完全数")
else:
print(n, "不是完全数")
可以点击使用Python判断完全数直接运行。
Scratch实现的判断完全数的方法
下面为使用Scratch实现的判断一个自然数是否为完全数的代码:
点击绿旗时 // 判断输入的自然数是不是完全数
删除 [因数 v] 的全部项目
询问 [输入一个自然数] 并等待
求因数 (回答) :: custom
将 [和 v] 设为 [0]
将 [我的变量 v] 设为 [1]
重复执行 ([因数 v] 的项目数) 次
将 [和 v] 增加 ([因数 v] 的第 (我的变量) 项)
将 [我的变量 v] 增加 (1)
end
如果 <(和) = (回答)> 那么
说 [是完全数] (2) 秒
否则
说 [不是完全数] (2) 秒
end
其中,“求因数”的自定义模块代码如下:
定义 求因数 (n :: custom-arg)
将 [我的变量 v] 设为 [1]
重复执行 ((n :: custom-arg) - (1)) 次
如果 <((n :: custom-arg) 除以 (我的变量) 的余数) = (0)> 那么
将 (我的变量) 加入 [因数 v]
end
将 [我的变量 v] 增加 (1)
end
读者可以思考一下这些Scratch代码哪些地方可以优化?为什么?
题图来自Pixabay,欧几里得雕像照片来自Wikipedia。