You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求解欧拉计划第3题时Python代码执行过慢问题咨询

优化欧拉计划第3题代码:搞定大数质因数分解效率问题

嘿,刚学完Python基础就冲欧拉计划,必须给你点个赞——这绝对是练手提升的好选择!你的代码对小数字有效,但碰到600851475143这种超大数就卡壳,核心问题确实是算法效率太低,咱们一步步拆解优化:

你的代码效率瓶颈在哪?

1. 质数判断函数的冗余与低效

你的prime()函数有两个明显的问题:

  • 循环范围太大:判断一个数是否为质数,根本不用遍历到num-1,只需要到sqrt(num)就够了——如果num有一个大于平方根的因数,那对应的另一个因数肯定小于平方根,提前终止循环能大幅减少计算量。
  • 冗余的primecount变量:其实只要找到一个能整除num的数,直接返回False就行,完全不用统计次数再做判断,多做了无用功。

2. 主循环的思路错了

你从2遍历到原数,逐个检查是不是因数再判断质数,对于600851475143这种量级的数,这个循环次数是天文数字,根本跑不完。正确的思路应该是主动分解质因数,而不是被动找所有因数。

优化后的高效代码

下面是针对质因数分解优化后的代码,逻辑更清晰,处理大数秒出结果:

def largest_prime_factor(n):
    # 先处理偶数:把所有2的因子都除干净
    largest_factor = 2
    while n % 2 == 0:
        n = n // 2
    
    # 现在n是奇数了,从3开始遍历,每次加2(跳过偶数)
    # 循环到sqrt(n)即可,因为更大的因子会被之前的除法处理掉
    i = 3
    while i * i <= n:
        # 如果i是n的因子,就一直除到不能整除为止,记录当前最大因子
        while n % i == 0:
            largest_factor = i
            n = n // i
        i += 2
    
    # 如果最后剩下的n大于2,说明它本身就是质数,也就是最大的质因数
    if n > 2:
        largest_factor = n
    
    return largest_factor

# 测试目标数
target_num = 600851475143
print(f"The largest prime factor of {target_num} is {largest_prime_factor(target_num)}")

关于要不要先学CLRS的问题

完全没必要!CLRS是经典的算法理论教材,但它偏学术、门槛高,对于刚入门编程的你来说太厚重了。欧拉计划本身就是绝佳的算法实践场,你可以边做题边针对性学算法——比如碰到质因数分解就查相关优化技巧,碰到求和问题就研究数学公式,这样边练边学的效率远高于先啃厚书。等你有了一定的编程和算法基础,再去看CLRS才会有真正的收获。

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

火山引擎 最新活动