有谁知道我可以在 C# 中计算非常大的整数的方法
我正在尝试计算数字的阶乘,例如
5!= 5*4*3*2*1 = 120
对于小数字,这不是问题,但试图计算 unsigned int 的最大值的阶乘,即 4,294,967,295,这似乎是不可能的。
我已经查看了 BigInteger 类,但它似乎没有做我需要的
任何帮助将不胜感激
要计算阶乘,uint.MaxValue
您需要大量存储空间。
例如,维基百科的文章为 8.2639316883... × 10^5,565,708。你会疯狂地获取信息。
我强烈怀疑你不会在理智的时间内找到任何在理智的计算机上计算它的方法。为什么需要这个值?斯特林的近似值是否足够接近?
首先,值得指出的是, 的阶乘uint.MaxValue
是天文数字。我无法很好地估计其阶乘的数量级,但它的位表示可能会占据标准 RAM 的很大比例,如果不是很好的话。
一个BigInteger
类似乎是你想要的,只要你只想提高到大约 1,000,000 左右(非常粗略)。在那之后,时间和记忆变得非常令人望而却步。在 .NET 的当前(稳定)版本(最高 3.5)中,您必须使用自定义实现。CodeProject 上的这个似乎得到了很高的评价。如果您碰巧正在为 .NET 4.0 开发,Microsoft 团队终于开始在 BCLBigInteger
的命名空间中包含一个类。System.Numerics
与一些 BigInteger 实现不同,.NET 4.0 中存在的那个没有内置的阶乘方法(我不确定 CodeProject 的那个),但是实现一个应该很简单——扩展方法会很好方式。
由于您似乎认为您不想使用 BigInteger 类型,因此如果您可以在阅读我的回复后验证它不是您想要的,然后准确解释为什么它不适合您的目的,这将很有帮助。
4294967295! = 10^(10^10.597) ~ 10^(40000000000) This value requires about 40 Gb of RAM to store, even if you will find any BigInteger implementation for C#!
P.S. Well, with optimized storing, let's say 9 digits in 4 bytes, it will take ~18 Gb of RAM.
为什么你认为你需要计算这些阶乘?对于进行实际计算的任何事情,它实际上都没有用。
仅计算 (2^32-1) 的阶乘结果会占用大量空间,大约 16 GB。
计算本身当然会花费很多时间。如果您构建程序以便可以将计算过程转移到发明时更快的硬件,那么您应该能够在您的有生之年获得结果。
如果您尝试解决类似于欧拉问题的问题,请考虑通过消除实际上无需计算即可获得答案的问题来找到许多解决方案。
Here . The fastest one, straight from the Factorial Man - Peter Luschny.
尝试为此任务使用数组。您可以使用尽可能长的整数,因为您有可用的内存空间。数组的每个成员都代表一个十进制数字。您唯一需要的是实现乘法运算。
您现在可以使用 J# 库中的 BigInteger 类。 这是一篇关于如何的文章。它使部署更加困难,因为您必须发送J# redistributable。您还可以考虑使用VS2010 beta,因为Framework 4.0 将具有 BigInteger。
如果您安装了 J# redist,另一种方法是java.math.BigInteger
通过添加对程序集的引用来使用vjslib
。
例如,如果您正在使用诸如组合之类的阶乘进行计算,您很少需要一直乘以 1(例如 98 * 98 * 97,因为其他所有内容都会抵消)。