我有以下代码来查找阶乘:
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仅供参考。
答案 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 and Fibonacci in VB.NET
答案 2 :(得分:1)
有一个 big int Library for .NET 可以解决您的问题。它可以操作非常大的数量(仅受系统内存的限制)。