求解欧拉计划第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




