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

为何Python因式分解程序处理大于102030405060708001的数时失效?

问题:Python因式分解程序处理大数出错的原因

这段Python因式分解程序在处理102030405060708001及以内的整数时运行正常,但处理更大的整数时会产生错误结果。请问这是为什么?

import math

a = []


def prime(n):
    isPrime = True
    for r in range(2,int(n**(1/2)+1)):
        if n%r == 0:
            isPrime = False
    return isPrime


def factor(number):
    if prime(number):
        a.append(int(number))

    for r in range(2, 1 + int(number**(1/2))):
        if number%r == 0:
            a.append(r)
            number = number/r
            factor(number)
            break
    
    return a        


number = int(input("Enter a number whose factors you want:"))
factor(number)
print(f"Factor of {number} are ", end = ": ")
print(*a, sep = ' X ')    
print(math.prod(a))

示例结果

  • 102030405060708001的因式分解结果为:1867601 X 54631800401,乘积为102030405060708001(正确)。
  • 102030405060708002的因式分解结果为:2 X 2 X 2 X 2 X 2 X 3 X 3 X 5 X 5 X 5 X 6133 X 462119341,乘积为102030405060708000(错误)。
  • 102030405060708003的因式分解结果为:3 X 2 X 2 X 2 X 2 X 2 X 3 X 5 X 5 X 5 X 6133 X 462119341,乘积为102030405060708000(错误)。

错误原因分析

  • 浮点数精度丢失:Python用**(1/2)计算平方根会返回浮点数,而64位双精度浮点数只能精确表示2^53以内的整数。处理超过该范围的大数时,平方根计算结果会失真,导致int(n**(1/2)+1)取整错误,循环遍历的因数范围不正确,要么漏掉真正的因数,要么错误判断质数。同时number = number/r用浮点数除法会丢失整数精度,后续递归处理的number已不是精确整数,进一步引发分解错误。
  • 全局列表未重置:全局列表a在每次调用factor前未清空,处理多个大数时,前一次分解的结果会残留其中,导致后续输出的因式分解结果混入无关因数,比如示例中102030405060708003的结果包含了前一个数的因数。
  • factor函数逻辑漏洞:当输入的number是质数时,执行a.append(int(number))后未终止函数,会继续进入后续for循环。结合浮点数精度问题,大数质数的平方根计算失真,循环范围错误,可能导致错误尝试分解质数,加剧结果偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:35:22