求助:查找6之后三个连续完全数的Python代码无输出问题排查
解决你的完全数查找问题
嘿,我来帮你排查下代码的问题!你说运行代码后没输出,其实不是代码逻辑完全错误,而是效率太低导致程序需要运行极长时间才能算出结果——毕竟完全数之间的间隔超大,6之后的下三个是28、496、8128,原代码的因数计算方式对大数来说太慢了。
原代码的核心问题
你的f(x)函数在计算因数和时,循环范围是range(1,x-1),这意味着对于像496这样的数,要循环494次;到8128时,要循环8126次,这会让程序卡在计算里,看起来像没输出。而且这个范围其实没必要,因为一个数的真因数不会超过它的平方根的对应数,我们可以利用因数成对出现的特性来大幅优化。
修正后的代码
我重写了因数和的计算逻辑,同时保留你的核心查找逻辑,这样能很快得到结果:
# Find three consecutive perfect numbers after 6 def sum_of_proper_divisors(x): """计算x的所有真因数(除自身外)的和""" if x == 1: return 0 total = 1 # 1是所有大于1的正整数的真因数 sqrt_x = int(x ** 0.5) # 利用因数成对的特性,只循环到x的平方根 for i in range(2, sqrt_x + 1): if x % i == 0: total += i counterpart = x // i # 避免平方数的因数重复添加(比如4的因数2,只加一次) if counterpart != i: total += counterpart return total counts = 0 perfect_numbers = [] x = 6 while counts < 3: # 找到3个后停止循环 x += 1 divisor_sum = sum_of_proper_divisors(x) if x == divisor_sum: perfect_numbers.append(x) counts += 1 print(f"已找到完全数: {x}") # 显示进度,避免误以为程序没反应 print("6之后的三个连续完全数:", perfect_numbers)
代码改动说明
- 优化因数计算逻辑:通过循环到
x的平方根,利用因数成对的特性(比如28的因数2和14是一对),把循环次数从O(x)降到O(√x),速度提升非常明显。 - 添加进度提示:在找到完全数时打印信息,让你能看到程序在运行,不会以为没输出。
- 边界处理:针对x=1的情况做了特殊处理,避免计算错误。
运行这段代码后,你会很快得到结果[28, 496, 8128]。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

