You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:查找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)

代码改动说明

  1. 优化因数计算逻辑:通过循环到x的平方根,利用因数成对的特性(比如28的因数2和14是一对),把循环次数从O(x)降到O(√x),速度提升非常明显。
  2. 添加进度提示:在找到完全数时打印信息,让你能看到程序在运行,不会以为没输出。
  3. 边界处理:针对x=1的情况做了特殊处理,避免计算错误。

运行这段代码后,你会很快得到结果[28, 496, 8128]。

内容的提问来源于stack exchange,提问作者Alexis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:47:34