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

如何修改C# LINQ代码以支持计算到170的双精度阶乘?

解决LINQ阶乘计算溢出问题,支持到170!

你的问题核心是Aggregate默认使用int类型运算,当计算13!时就会超出int的最大值(2147483647)导致溢出,进而得到错误结果。以下两种修改方式可以轻松支持到170!:

方式一:使用double类型计算(近似值,无需额外引用)

double类型的最大值可以容纳170!(171!会超出范围变为无穷大),只需给Aggregate指定double类型的初始值,让整个运算过程在double类型下进行:

var listOfFactorials = from fact in Enumerable.Range(0, 171).Reverse()
                       select new 
                       { 
                           Number = fact, 
                           Factorial = fact == 0 ? 1d : Enumerable.Range(1, fact).Aggregate(1.0, (i, j) => i * j) 
                       };

方式二:使用BigInteger计算(精确值,需引用System.Numerics)

如果需要精确的阶乘结果(而非近似值),可以用BigInteger类型,它支持任意大的整数运算,不会出现溢出:

首先添加命名空间引用:

using System.Numerics;

然后修改LINQ代码:

var listOfFactorials = from fact in Enumerable.Range(0, 171).Reverse()
                       select new 
                       { 
                           Number = fact, 
                           Factorial = fact == 0 ? BigInteger.One : Enumerable.Range(1, fact).Aggregate(BigInteger.One, (i, j) => i * j) 
                       };

为什么原来的代码失效?

你原来的代码中,Enumerable.Range(1, fact).Aggregate((i, j) => i * j)没有指定初始值,默认会取序列的第一个元素(int类型)作为累加器的初始值,后续所有乘法运算都在int类型下进行,一旦超过int的范围就会溢出,导致结果错误。通过指定初始值为1.0(double)或BigInteger.One,就能强制运算在对应类型下执行,避免溢出问题。

内容的提问来源于stack exchange,提问作者Sp Rosťa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:44:54