zoukankan      html  css  js  c++  java
  • 大数阶乘的计算(三)

    下面的算法在 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 位

  • 相关阅读:
    20145319 《信息安全系统设计基础》第0周学习总结
    20145319 《java程序设计》课程总结
    20145319 第十周学习总结
    20145319 实验五
    20145319 实验四
    20145319 第九周学习总结
    20145319 第八周学习总结
    20145319 实验三
    20145319 第七周学习总结
    20145312 《Java程序设计》第六周学习总结
  • 原文地址:https://www.cnblogs.com/fengju/p/6336399.html
Copyright © 2011-2022 走看看