有没有人知道在 c# 中计算非常大的整数的方法?
我试图计算数字的阶乘,例如:
5! = 5*4*3*2*1 = 120
对于小数字来说,这不是问题,但试图计算无符号整数的最大值(4294967295)的阶乘似乎是不可能的。
我已经研究了 BigInteger 类,但它似乎不能满足我的需求。
任何帮助都将不胜感激。
有没有人知道在 c# 中计算非常大的整数的方法?
我试图计算数字的阶乘,例如:
5! = 5*4*3*2*1 = 120
对于小数字来说,这不是问题,但试图计算无符号整数的最大值(4294967295)的阶乘似乎是不可能的。
我已经研究了 BigInteger 类,但它似乎不能满足我的需求。
任何帮助都将不胜感激。
要计算uint.MaxValue
的阶乘,需要大量的存储空间。
例如,维基百科文章给出的结果为8.2639316883... × 10^5,565,708。你将会不断获取信息。
我强烈怀疑你不可能在一台正常的计算机上在合理的时间内计算出这个值。你需要这个值吗?使用斯特林公式近似计算是否足够精确?
uint.MaxValue
的阶乘是极大的。我无法找到其阶乘数量级的良好估计,但如果不超过标准RAM的高比例,其位表示可能会占用很高的百分比。BigInteger
类似乎是您想要的。在当前(稳定)版本的.NET中,直到3.5,您必须使用自定义实现。CodeProject上的这个实现似乎评价很高。如果您正在开发.NET 4.0,则微软团队终于开始在BCL的System.Numerics
命名空间中包含一个BigInteger
类。与一些BigInteger实现不同,存在于.NET 4.0中的实现没有内置的阶乘方法(我不确定CodeProject的实现如何),但是实现一个该方法应该很容易——扩展方法是一种好方式。4294967295! = 10^(10^10.597) ~ 10^(40000000000)。即使你能找到任何C#的BigInteger实现,这个值需要大约40 Gb的RAM来存储。
另外,如果采用优化的存储方式,比如说4字节存储9位数字,那么需要大约18 Gb的RAM。
目前您可以使用J#库中的BigInteger类。这里有一篇文章。但是这会使部署变得更加困难,因为您需要发送J#可再发行组件。您也可以考虑升级到VS2010 beta,因为Framework 4.0将拥有BigInteger。
如果你正在进行阶乘计算,例如组合,你很少需要一直乘到1(例如98 * 98 * 97,因为其他所有数都会被消除)。