参考http://blog.csdn.net/northwolves/category/12809.aspx?Show=All比如大数阶乘的计算(三) Sub calcfactorial(ByVal n As Integer) Dim XYS() As Integer, x() As Integer, y() As Integer, result() As String, i As Long, j As Long, k As Long, TEMP As Long, stimer As Double If n < 0 Then Exit Sub ReDim x(1) ReDim XYS(1) x(1) = 1 XYS(1) = 1 k = 1 stimer = Timer Do While k <= nTEMP = Len(CStr(k)) ReDim y(1 To TEMP) For i = 1 To TEMP y(i) = Val(Mid(k, TEMP + 1 - i, 1)) Next ReDim XYS(1 To UBound(x) + UBound(y)) For i = 1 To UBound(x) For j = 1 To UBound(y) XYS(i + j - 1) = XYS(i + j - 1) + x(i) * y(j) Next Next For i = 1 To UBound(x) + UBound(y) - 1 TEMP = XYS(i) \ 10 XYS(i) = XYS(i) Mod 10 XYS(i + 1) = XYS(i + 1) + TEMP Nextx = XYS If x(UBound(x)) = 0 Then ReDim Preserve x(1 To UBound(x) - 1) k = k + 1 Loop ReDim result(1 To UBound(x)) For i = 1 To UBound(x) result(i) = x(UBound(x) + 1 - i) Nextfactorial = Join(result, "") Debug.Print k - 1 & "! : 用时 "; Timer - stimer & " 秒, 结果 " & UBound(x) & " 位" Debug.Print factorial Erase x() Erase y() Erase XYS() Erase result() End SubPrivate Sub Command1_Click() For i = 1 To 9 calcfactorial i * 100 Next For i = 1 To 10 calcfactorial i * 100 Next End Sub 关键是 Join、Mid等函数的作用
Sub calcfactorial(ByVal n As Integer)
Dim XYS() As Integer, x() As Integer, y() As Integer, result() As String, i As Long, j As Long, k As Long, TEMP As Long, stimer As Double
If n < 0 Then Exit Sub
ReDim x(1)
ReDim XYS(1)
x(1) = 1
XYS(1) = 1
k = 1
stimer = Timer
Do While k <= nTEMP = Len(CStr(k))
ReDim y(1 To TEMP)
For i = 1 To TEMP
y(i) = Val(Mid(k, TEMP + 1 - i, 1))
Next
ReDim XYS(1 To UBound(x) + UBound(y))
For i = 1 To UBound(x)
For j = 1 To UBound(y)
XYS(i + j - 1) = XYS(i + j - 1) + x(i) * y(j)
Next
Next
For i = 1 To UBound(x) + UBound(y) - 1
TEMP = XYS(i) \ 10
XYS(i) = XYS(i) Mod 10
XYS(i + 1) = XYS(i + 1) + TEMP
Nextx = XYS
If x(UBound(x)) = 0 Then ReDim Preserve x(1 To UBound(x) - 1)
k = k + 1
Loop
ReDim result(1 To UBound(x))
For i = 1 To UBound(x)
result(i) = x(UBound(x) + 1 - i)
Nextfactorial = Join(result, "")
Debug.Print k - 1 & "! : 用时 "; Timer - stimer & " 秒, 结果 " & UBound(x) & " 位"
Debug.Print factorial
Erase x()
Erase y()
Erase XYS()
Erase result()
End SubPrivate Sub Command1_Click()
For i = 1 To 9
calcfactorial i * 100
Next
For i = 1 To 10
calcfactorial i * 100
Next
End Sub
关键是 Join、Mid等函数的作用
我没学过布尔代数,纯属个人理解,不知道对不对,还请高人指点。
其他的大树运算我都是用String类型解决的。