溢出异常?

我有以下代码来查找阶乘:
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仅供参考。     
已邀请:
因子非常快,非常快。适合
Long
的最大数量约为9×10 ^ 18。因子(30)约为2.7×10 ^ 32。 如果您使用的是.Net 4,则可以使用内置的
BigInteger
类,它可以容纳任意大的数字。 如果您不使用.Net 4,则需要查找并下载BigInteger库,例如intx。     
只有整数和长类型才能获得溢出异常。为避免这种情况,您可以使用System.Double或System.Numerics.BigInteger(或者我认为是BigDecimal)。 例如, 如果运行3个不同版本的阶乘:1表示长,1表示双精度,1表示带有biginteger,如下所示,值范围为5到50乘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中的Factorial和Fibonacci     
有一个.NET的大型.NET库可以解决您的问题。它可以操作非常大的数量(仅受系统内存的限制)。 这是链接:http://www.emilstefanov.net/Projects/GnuMpDotNet/     

要回复问题请先登录注册