【问题标题】:Factorial Algorithm which uses no Big-Integer library不使用大整数库的阶乘算法
【发布时间】: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


【解决方案1】:

您必须编写自己的大整数库。查看 Knuth 第 2 卷以开始使用。

您的期望看起来有点……过于热情。无论您做什么,您都将无法计算 9878945647978979798798797189 的阶乘。

【讨论】:

  • 是的,它有点过于热情,我的意思是程序不应该有任何限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2012-09-27
  • 2016-11-29
  • 2013-02-19
  • 2020-07-28
相关资源
最近更新 更多