下面的算法在 http://www.csdn.net/Develop/Edit.asp?id=28308基础上改进,比其至少快10%:
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 <= n
TEMP = 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 Next
x = 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) Next
factorial = Join(result, "") Debug.Print k - 1 & "! : 用时 "; Timer - stimer & " 秒, 结果 " & UBound(x) & " 位" ''''Debug.Print factorial Erase x() Erase y() Erase XYS() Erase result() End Sub
Private Sub Command1_Click() For i = 1 To 9 calcfactorial i * 100 Next For i = 1 To 10 calcfactorial i * 100 Next
End Sub
结果输出:
100! : 用时 1.17187501018634E-05 秒, 结果 158 位 200! : 用时 3.10087890625255E-02 秒, 结果 375 位 300! : 用时 .1090087890625 秒, 结果 615 位 400! : 用时 .219002929687576 秒, 结果 869 位 500! : 用时 .344011718749925 秒, 结果 1135 位 600! : 用时 .547008789062602 秒, 结果 1409 位 700! : 用时 .75 秒, 结果 1690 位 800! : 用时 .9840087890625 秒, 结果 1977 位 900! : 用时 1.281005859375 秒, 结果 2270 位 1000! : 用时 1.59400292968758 秒, 结果 2568 位 2000! : 用时 8.36000292968743 秒, 结果 5736 位 3000! : 用时 20.4220146484374 秒, 结果 9131 位 4000! : 用时 38.1090146484376 秒, 结果 12674 位 5000! : 用时 61.6250058593751 秒, 结果 16326 位 6000! : 用时 91.1560175781251 秒, 结果 20066 位 7000! : 用时 126.781014648438 秒, 结果 23878 位 8000! : 用时 168.610005859375 秒, 结果 27753 位 9000! : 用时 216.530892578125 秒, 结果 31682 位 10000! : 用时 271.000017578125 秒, 结果 35660 位
没有相关教程
|