我编写了一个代码,用于在多行教科书中输出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
答案 0 :(得分:1)
溢出是因为13!
太大而无法放入整数。
最大可表示integer
(32位签名)
所以:
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