0

我在多行教科书中编写了一个代码来输出帕斯卡三角形。该程序适用于 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
4

2 回答 2

1

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

最大的可表示integer(32 位有符号)是

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

所以 :

 12!    =  479001600  
 MaxInt = 2147483647
 13!    = 6227020800    

如果要使用比这更大的数字,则需要使用更大的数字类型。下一个较大的类型是Long(64-bit signed, max 9223372036854775807) 或者,为了您的目的,ULong(unsigned 64-bit,因为您不需要负数,它是 at 的两倍18446744073709551615)。

这会让你计算最多20!,也就是2432902008176640000。对于大于此的数字,您将需要考虑使用任何一个BigInteger或其他允许保存和计算任意大数字的专用库。

或者,您可以查看其他不使用阶乘计算任意行的方法。

于 2015-09-29T23:34:17.183 回答
1

您的主要问题是您使用Integer的太小而无法容纳 13 的阶乘。将 Factorial 函数更改为 return 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
于 2015-09-29T23:37:53.120 回答