Python无法处理大数字?求解600851475143最大质因数的代码无输出问题排查
你的代码问题分析&修复方案
嘿,我看了你的代码,确实有几个关键问题导致处理600851475143这种超大数时要么卡到没输出,要么逻辑出错,咱们一步步说:
1. 最致命的问题:遍历范围太离谱
在prime函数里,你写了range(2,int(n))来找n的因数——想想看,600851475143是个百亿级的数,这个循环要从2跑到600多亿,程序根本不可能在合理时间内跑完,看起来就像“没有输出”一样。
实际上找因数根本不用跑这么远,只需要遍历到n的平方根(sqrt(n))就行!因为如果i是n的因数,那n/i肯定也是n的因数,这样循环次数直接从百亿级砍到百万级,效率提升N倍。
2. 质数判断的运算顺序写错了
isprime里的k**1/2是个低级错误!Python里**的优先级比/高,所以这个式子其实是(k^1)/2,也就是k/2,不是平方根!正确的写法应该是k**0.5,或者用math.sqrt(k)(记得先导入math模块),这样才能得到正确的质数判断范围。
3. 逻辑太冗余:先找所有因数再筛质数
你先把n的所有因数都找出来,再一个个判断是不是质数,这对于大数来说完全没必要。咱们可以直接在分解质因数的过程中,实时记录最大的那个质因数,一步到位,省掉额外的列表存储和筛选步骤。
修复后的高效代码
我给你改了一个专门针对大数的版本,跑600851475143秒出结果:
import math def largest_prime_factor(n): max_prime = -1 # 先把所有2的因子除干净 while n % 2 == 0: max_prime = 2 n = n // 2 # 现在n是奇数,从3开始遍历到sqrt(n),步长设为2(跳过偶数) for i in range(3, int(math.sqrt(n)) + 1, 2): # 只要i能整除n,就一直除,直到不能整除为止 while n % i == 0: max_prime = i n = n // i # 如果最后剩下的n大于2,说明它本身就是个质数 if n > 2: max_prime = n return max_prime print(largest_prime_factor(600851475143))
为什么这么写?
- 先处理偶数:因为2是唯一的偶质数,先把所有2的因子都除尽,后面就只需要处理奇数了
- 遍历奇数因子:从3开始,每次加2,减少一半的循环次数
- 实时更新最大质因数:每次找到能整除的因子,就更新最大质因数,同时把n除以这个因子,缩小后续的计算范围
- 收尾检查:如果最后剩下的n大于2,说明它本身就是一个质数,直接作为最大质因数
运行这个代码,你马上就能得到600851475143的最大质因数是6857。
内容的提问来源于stack exchange,提问作者hemingway_
相关产品推荐
相关产品推荐

