📅  最后修改于: 2023-12-03 15:11:27.339000             🧑  作者: Mango
完美数字是指一个正整数,它的所有因子(除了本身)的和等于这个数本身。
例如,6是一个完美数字,因为6的因子为1、2、3,它们的和也等于6。
我们可以使用Python编程语言来检查数字是否是完美数字。下面是一个简单的程序:
def is_perfect_number(n):
if n == 1:
return False
sum_of_factors = 1
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
sum_of_factors += i
if n // i != i:
sum_of_factors += n // i
return sum_of_factors == n
n = int(input("请输入一个正整数:"))
if is_perfect_number(n):
print(f"{n}是完美数字")
else:
print(f"{n}不是完美数字")
这个程序首先定义了一个函数is_perfect_number
,它的参数是一个正整数n
,返回一个布尔值,表示n
是否是完美数字。实现这个函数的方法是计算出n
的所有因子之和,然后和n
比较。
然后读取用户输入的数字n
,调用is_perfect_number
函数判断它是否为完美数字,如果是,则输出结果,否则也输出结果。
上面的程序对于一般大小的数字是可以接受的,但是对于非常大的数字来说,因子数太多的话会导致运行速度很慢。为了优化程序的性能,我们可以采用一个更加高效的算法。
这个算法的思路是先找到n
的一个因子i
,然后把它和另外一个因子n//i
一起计入因子和中,这样可以减少循环的次数,从而提高效率。下面是优化后的程序:
def is_perfect_number(n):
if n == 1:
return False
sum_of_factors = 1
i = 2
while i ** 2 <= n:
if n % i == 0:
sum_of_factors += i
if n // i != i:
sum_of_factors += n // i
i += 1
return sum_of_factors == n
n = int(input("请输入一个正整数:"))
if is_perfect_number(n):
print(f"{n}是完美数字")
else:
print(f"{n}不是完美数字")
这个程序实现了一个类似于埃拉托色尼筛选法的算法,不过只要找到一个因子就可以算出它对应的另外一个因子。这个算法的时间复杂度是Θ(√n),比较高效。