如何优化输入处理解决OverflowError:整数过大无法转换为浮点数?
问题分析与解决方案
你的代码出现OverflowError的原因是当n较大时,累加的阶乘和second = sum(fact(i+1) for i in range(n))会变成远超浮点数最大值的超大整数,转换为浮点数时触发溢出错误。
优化方案:递推计算避免大数运算
观察阶乘求和的数学规律,可推导递推公式:going(n) = 1 + going(n-1)/n
初始条件:going(1) = 1.0(因为1!/1! = 1)
这个公式完全避免了超大阶乘的计算,每一步都是小数运算,不会出现溢出。
优化后的代码
def going(n): res = 1.0 for i in range(2, n+1): res = 1 + res / i # 截断至6位小数(若需严格截断而非四舍五入,该方式更合适) return float("{:.6f}".format(res))
补充说明
- 若允许四舍五入,也可以直接使用
round(res, 6)替代格式化转浮点数的操作。 - 当
n足够大时(比如n>=20),后续迭代对小数点后6位的影响可忽略,此时可提前终止循环进一步优化,但递推本身效率已经很高,无需额外处理。
内容的提问来源于stack exchange,提问作者Firas Attieh
相关产品推荐
相关产品推荐

