帕斯卡三角形给出溢出13

时间:2015-09-29 23:07:34

标签: vb.net biginteger pascals-triangle

我编写了一个代码,用于在多行教科书中输出Pascal三角形。该程序适用于1到12之间的输入,但一旦输入值为13,就会出现溢出错误。

我是否可以进行任何修改以使程序能够准确地为13及更高版本提供输出?

以下是我使用的代码:

Public Class pascal_triangle

    Private Function factorial(ByVal k As Integer) As Integer
        If k = 0 Or k = 1 Then
            Return 1
        Else
            Return k * factorial(k - 1)
        End If
    End Function


    Private Sub BtnGen_Click(sender As Object, e As EventArgs) Handles BtnGen.Click
        Dim nCr As Integer
        Dim i, j, k As Integer
        Dim output As String

        output = ""

        j = Val(TxtColumn.Text)

        For k = 0 To j
            For i = 0 To k
                Dim fact, fact1, fact2 As Integer

                fact = factorial(k)
                fact1 = factorial(k - i)
                fact2 = factorial(i)
                nCr = fact / (fact1 * fact2)
                TxtOutput.Text += Str(nCr) & output
            Next
            TxtOutput.Text += vbCrLf
        Next
    End Sub

End Class

2 个答案:

答案 0 :(得分:1)

溢出是因为13!太大而无法放入整数。

最大可表示integer(32位签名)

  • 2147483647(0x7FFFFFFF == 01111111 11111111 11111111 11111111b)

所以:

 12!    =  479001600  
 MaxInt = 2147483647
 13!    = 6227020800    

如果要使用大于此数字的数字,则需要使用更大的数字类型。下一个较大的类型是Long(64位已签名,最大9223372036854775807),或者为了您的目的,ULong(无符号64位,因为您不需要负数,是18446744073709551615)的两倍。

这样您最多可以计算20!,即2432902008176640000。对于大于此数字的数字,您需要查看使用BigInteger或其他允许保留和计算任意大数的专用库。

或者,您可以查看计算任意行without using factorials的其他方法。

答案 1 :(得分:1)

您的主要问题是您使用的Integer太小而无法保持13的阶乘。更改您的因子函数以返回Long。转换Option Strict On并将nCr设为Double也是一个好主意。

Private Function factorial(ByVal k As Integer) As Long
    If k = 0 Or k = 1 Then
        Return 1
    Else
        Return k * factorial(k - 1)
    End If
End Function

Private Sub BtnGen_Click(sender As Object, e As EventArgs) Handles BtnGen.Click
    Dim nCr As Double
    Dim i, j, k As Integer
    Integer.TryParse(TxtColumn.Text, j)
    For k = 0 To j
        For i = 0 To k
            Dim fact, fact1, fact2 As Long
            fact = factorial(k)
            fact1 = factorial(k - i)
            fact2 = factorial(i)
            nCr = fact / (fact1 * fact2)
            TxtOutput.Text += nCr.ToString & " "
        Next
        TxtOutput.Text += vbCrLf
    Next
End Sub