我正在研究计算机工程,我们有一项艰巨的任务。
我们必须开发一个C#应用程序,它可以在没有 BIGINT 的情况下计算真正大数的阶乘。我的意思是非常大的数字,比如 123564891 ... 82598413!。我们不必使用权限来使用自定义库(例如 BIGINT )。
对此进行了研究,发现了一些像这样的问题,但是这个问题与其他问题不同,因为我们必须在没有任何自定义库的情况下计算非常大的数字。我找到了PoorMans Algorithm。但它的计算高达10000。这对我们来说还不够。
与我的队友一起,我们找到了解决方案。假设我们将获得123的阶乘。我们将获得123作为字符串。然后,我们将总和123,122次(它等于123 x 122)。然后总结结果121次。它会像这样直到达到1.所以,我们将总结两个字符串。
我们创建了一个用于求和字符串的算法。我们得到第一个数字的最后一个字符(123中的3个)作为整数(我们可以使用整数,但不是bigint)。并将第二个数字的最后一个字符作为整数(122个中的2个)。求它们并找到结果编号的最后一个字符(结果= x ... x5)。我们将从最后一个char到第一个char。最后,我们将获得结果编号。但是如你所知,我们应该使用while()或for()循环,并且为了使用这个循环,我们需要再次使用bigint。
String number = "9878945647978979798798797189"; //we will get factorial of this
for(int i = 0;i < number.Length; i++)
{
// sum all chars one by one
}
我们不能使用这样的循环,因为i
变量将超出整数范围,我们将得到错误。所以我们必须在这里使用bigint。我希望我能解释一下。
现在我的问题,用于创建算法的演练,该算法可以在不使用BIGINT的情况下计算真正大数的阶乘。
这是程序员问题,而不是Math.stackexchange.com问题,因为我需要直接的程序化答案和演练。如果我在Math网站上问这个问题,他们会给我这个清单:http://www.luschny.de/math/factorial/FastFactorialFunctions.htm。可能他们不会理解我的' BIGINT问题'。
答案 0 :(得分:4)
您必须编写自己的大整数库。检查Knuth Volume 2以开始使用。
你的期望看起来有点......过于热情。无论你做什么,你都 无法计算9878945647978979798798797189的阶乘。