在c#中使用非常大的整数

时间:2009-05-30 21:02:22

标签: c# factorial

有没有人知道我可以用c#

计算非常大的整数

我试图计算数字的阶乘,例如

5! = 5 * 4 * 3 * 2 * 1 = 120

小数字这不是问题,但是尝试计算unsigned int的bigest值的阶乘,这似乎是4,294,967,295。

我已经查看了BigInteger类但它似乎没有做我需要的东西

任何帮助将不胜感激

9 个答案:

答案 0 :(得分:10)

要计算uint.MaxValue的阶乘,您需要批次存储。

例如,Wikipedia article为8.2639316883 ...×10 ^ 5,565,708。你将获得疯狂的信息。

强烈怀疑你没有找到任何方法在理智的时间内在理智的计算机上计算它。你为什么需要这个价值?斯特林的近似值是否足够接近?

答案 1 :(得分:6)

首先,值得指出的是uint.MaxValue的阶乘天文数字大。我无法找到其阶乘的数量级的良好估计,但它的位表示可能占据标准RAM的高百分比,如果不是很好的话。

BigInteger课程似乎是你想要的,只要你想要达到大约1,000,000左右(非常粗略)。在那之后,时间和记忆变得非常令人望而却步。在.NET的当前(稳定)版本中,最多3.5,您必须使用自定义实现。似乎对CodeProject的This one评价很高。如果您正在为.NET 4.0开发,Microsoft团队终于开始在BCL的System.Numerics命名空间中包含BigInteger类。与一些BigInteger实现不同,.NET 4.0中存在的实现没有内置的阶乘方法(我不确定CodeProject的方法),但实现一个应该是微不足道的 - 扩展方法会很好方式。

由于您似乎认为您不想使用BigInteger类型,如果您可以验证它不是您想要阅读我的回复,那么将会有所帮助,然后准确解释为什么它不适合您的目的

答案 2 :(得分:5)

4294967295! = 10 ^(10 ^ 10.597)~10 ^(40000000000) 这个值需要大约40 Gb的RAM来存储,即使你会发现C#的任何BigInteger实现!

P.S。好吧,通过优化存储,让我们说4个字节的9位数字,需要~18 Gb的RAM。

答案 3 :(得分:2)

为什么你认为你需要计算这些因子?对于任何进行实际计算的事情来说,这并非实用。

计算因子(2 ^ 32-1)的结果只会占用大量空间,大约16 GB。

计算本身当然会耗费大量时间。如果您构建程序以便可以将计算过程转移到更快的硬件上,那么您应该能够在生命周期内获得结果。

如果你想要解决的问题类似Euler,可以考虑通过消除你实际上没有必要计算的内容来找到很多解决方案,以便得到答案。

答案 4 :(得分:1)

Here。 最快的一个,直接来自Factorial Man - Peter Luschny。

答案 5 :(得分:0)

尝试使用数组执行此任务。你可以使用长整数,因为你有可用的内存空间。数组的每个成员都代表一个十进制数字。您唯一需要的是实现多重化。

答案 6 :(得分:0)

您现在可以使用J#库中的BigInteger类。 Here's an article on how。它使部署更难,因为你必须发送J# redistributable。您还可以考虑转到VS2010 beta作为Framework 4.0 will have BigInteger

答案 7 :(得分:0)

如果您安装了J#redist,另一种方法是使用java.math.BigInteger添加对vjslib程序集的引用。

答案 8 :(得分:0)

如果您正在使用像组合这样的因子进行计算,例如,您很少需要一直向下乘以1(例如,98 * 98 * 97,因为其他一切都取消了)。