【发布时间】:2013-04-04 22:53:33
【问题描述】:
我正在学习计算机工程,我们的任务很艰巨。
我们必须开发一个 C# 应用程序,它可以在没有 BIGINT 的情况下计算非常大的数字的阶乘。我的意思是非常大的数字,例如 123564891...82598413! 。而且我们不必使用权限来使用自定义库(如 BIGINT)。
研究它并发现了一些类似的问题,但这个问题与其他问题不同,因为我们必须在没有任何自定义库的情况下计算非常大的数字。我找到了PoorMans Algorithm。但它的计算量高达 10000 。这对我们来说还不够。
与我的队友一起,我们找到了解决方案。假设我们将得到 123 的阶乘。我们将得到 123 作为 String 。然后,我们将求和 123 , 122 次(等于 123 x 122)。然后将结果求和 121 次。它会一直这样直到达到 1。所以,我们将对两个字符串求和。
我们创建了一个对字符串求和的算法。我们将第一个数字(123 个中的 3 个)的最后一个字符作为整数(我们可以使用整数,但不能使用 bigint)。并将第二个数字的最后一个字符作为整数(122 中的 2)。将它们相加并找到结果编号的最后一个字符 (result = x...x5) 。我们将从最后一个字符到第一个字符进行操作。最后我们会得到结果编号。但如你所知,我们应该使用 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 问题,因为我需要直接编程答案和演练。如果我在数学网站上问这个问题,他们会给我这个列表:http://www.luschny.de/math/factorial/FastFactorialFunctions.htm。可能他们不会理解我的“BIGINT 问题”。
【问题讨论】:
-
我认为练习是要求您编写自己的 bigint 库。
-
你知道数字增长得非常快吗,你甚至无法存储你的数字的所有数字。而且需要很长时间。
-
@Eray 您对我们有什么期望?给你写? (我在您的帖子中没有看到问号)否则,作为计算机工程专业的学生,您可以实现自己的 BitInt 类。我猜你已经读过this
-
"9878945647978979798798797189"; //we will get factorial of this。假设您每秒可以进行 10 亿次乘法运算 :),则需要大约 313,259,311,516 年。 -
@Eray我可能搞错了,我只能是310亿年..
标签: c# algorithm biginteger factorial