这是少儿编程趣味数学系列教程的第二篇,讨论如何通过编程的方式判断一个自然数是否为完美数(完全数)。

什么叫完美数/完全数?

完美数(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判断一个自然数是否为完全数

我们可以用一种直接的方式来判断一个自然数是否为完全数:

  1. 首先求出该自然数除自身之外的所有因数
  2. 将所有因数相加,得到和
  3. 将因数相加得到的和和自然数本身进行比较,如果相等,则为完美数,否则,不是完美数。

下面是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。

文章分享二维码

微信扫码分享这篇文章

扫描二维码即可在手机中继续阅读,也方便转发给老师、家长或同学。

上一篇 少儿编程之趣味数学3:冰雹/考拉兹猜想 下一篇 少儿编程之趣味数学1:西西弗斯数字黑洞