c# - 不使用大整数库的阶乘算法

标签 c# algorithm biginteger factorial

我正在学习计算机工程,我们有一项艰巨的任务。

我们必须开发一个 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 问题”。

最佳答案

您将不得不编写自己的大整数库。查看 Knuth 第 2 卷开始。

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

关于c# - 不使用大整数库的阶乘算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15823115/

相关文章:

python - 开发算法可视化/模拟

c# - 如何创建一个获取除特定值以外的所有内容的 linq 查询

algorithm - 如何判断向 DAG 中添加边是否形成有向循环?

c# - 在 C# 中使用反射初始化 IEnumerable 属性 (propertyInfo)

algorithm - 如何有效地计算二项式累积分布函数?

java - 序列化 BigInteger : signum-magnitude mismatch

c++ - 不准确的 C++ 阶乘程序

java - Base-15 转换差异

c# - 在字典中选择特定对象类型并将其删除的最有效方法

c# - Entity Framework 和动态模式