溢出异常?

时间:2011-03-30 08:37:01

标签: vb.net overflow factorial

我有以下代码来查找阶乘:

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仅供参考。

3 个答案:

答案 0 :(得分:4)

因子非常快,很快。适合Long的最大数字约为9×10 ^ 18。因子(30)约为2.7×10 ^ 32。

如果你正在使用.Net 4,你可以使用一个内置的BigInteger类,它可以容纳任意大的数字。

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

答案 1 :(得分:2)

只有整数和长类型才能获得溢出异常。为避免这种情况,您可以使用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  

你会得到这样的结果:

Factorial execution results

您可以在我的博文中找到完整的源代码:Factorial and Fibonacci in VB.NET

答案 2 :(得分:1)

有一个 big int Library for .NET 可以解决您的问题。它可以操作非常大的数量(仅受系统内存的限制)。

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