0

我有以下代码用于查找阶乘:

Private Shared Function Factorial(ByVal Number As Long) As Long
        If Number = 0 Then
            Return 1
        Else
            Return Number * Factorial(Number - 1)
        End If
End Function

它通常会导致溢出。仅当我从 4 之类的小东西开始时才有效。

我必须使用 30-60 等起始数字。

有任何想法吗?我认为将值类型更改为 LONG 可以防止这个问题。

这是 VB.net 仅供参考。

4

3 回答 3

4

阶乘变得非常大,非常快。适合 a 的最大数 Long约为 9×10^18。阶乘(30)约为 2.7×10^32。

如果您使用的是 .Net 4,则可以使用一个内置BigInteger类来保存任意大的数字。

如果您不使用 .Net 4,则需要查找并下载 BigInteger 库,例如intx

于 2011-03-30T08:59:36.387 回答
2

只有整数和长类型才会出现溢出异常。为避免这种情况,您可以使用 System.Double 或 System.Numerics.BigInteger (或我认为的 BigDecimal)。

例如,如果您运行 3 个不同版本的阶乘:1 使用 long、1 使用 double 和 1 使用 biginteger,如下所示,值范围为 5 到 50 x 5:

    'Long Factorial   
    Public Function FactorialInt64(ByVal n As Integer) As Int64  
        If n = 1 Then  
            Return 1  
        Else  
            Return n * FactorialInt64(n - 1)  
        End If  
    End Function  
    ' Double Factorial   
    Public Function FactorialDouble(ByVal n As Integer) As Double  
        If n = 1 Then  
            Return 1  
        Else  
            Return n * FactorialDouble(n - 1)  
        End If  
    End Function  
    ' BigInteger Factorial   
    Public Function FactorialBigInteger(ByVal n As Integer) As BigInteger  
        If n = 1 Then  
            Return 1  
        Else  
            Return n * FactorialBigInteger(n - 1)  
        End If  
    End Function  

你会得到这样的结果:

阶乘执行结果

您可以在我的博客文章中找到完整的源代码:VB.NET 中的阶乘和斐波那契

于 2012-04-05T07:58:10.780 回答
1

有一个用于 .NET 的大型 int 库可以解决您的问题。它可以操作非常大的数字(仅受系统内存限制)。

这是链接:http ://www.emilstefanov.net/Projects/GnuMpDotNet/

于 2011-03-30T09:13:23.087 回答