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

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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:12:36