大數階乘的計算(四)

看了northwolves 的文章大數階乘的計算(三) http://dev.csdn.net/article/28/28432.shtm 很有啓發,聯想起以前自己編寫過一個類似的函數,方法與其差不多,都是動態數組的增位保存方式。效率上比northwolves兄要差一些,大約相差50%;當時以爲是最快的階乘算法了,所以看到這篇文章很是欽佩!

不過,我總覺得,這個算法還有可優化的餘地,於是,又重新做了點新嘗試,不想大獲成功,效率比大數階乘的計算(三)一下子又提高了5倍多,而且算法簡單得驚人,故不敢獨吞,趕緊貼出與大家共享。

Option Explicit
Private Function cacl(num As Long) As String
Dim numlen As Long, last As Long, x As Long
Dim i As Long, m As Long, n As Long
Dim result() As Long, starttime As Single
numlen = 1
starttime = Timer
ReDim result(1 To numlen)
result(1) = 1
x = 1
Do While x <= num
   last = 0
   For i = 1 To numlen
        m = result(i) * x + last
        result(i) = m Mod 10
        last = m / 10
   Next
   If last > 0 Then
        n = Len(CStr(last))
        ReDim Preserve result(1 To numlen + n)
        For i = 1 To n
            result(numlen + i) = last Mod 10
            last = last / 10
        Next
        numlen = UBound(result)
   End If
   x = x + 1
Loop
ReDim s(1 To numlen)
For i = 1 To numlen
s(i) = result(numlen + 1 - i)
Next
cacl = Join(s, "")
Debug.Print num & "! : 用時 "; Timer - starttime & " 秒, 結果 " & numlen & " 位"
End Function

Private Sub Command1_Click()
Dim i As Long
For i = 1 To 10
cacl i * 100
Next
'For i = 1 To 10
'cacl i * 1000
'Next
End Sub

輸出結果:(我的機器在運行“計算(三)”時,與其結果相當,所以應是與northwolves兄,同檔次的機器)

100! : 用時 0 秒, 結果 158 位
200! : 用時 1.171875E-02 秒, 結果 375 位
300! : 用時 3.515625E-02 秒, 結果 615 位
400! : 用時 4.296875E-02 秒, 結果 869 位
500! : 用時 8.203125E-02 秒, 結果 1135 位
600! : 用時 .1054688 秒, 結果 1409 位
700! : 用時 .15625 秒, 結果 1690 位
800! : 用時 .1992188 秒, 結果 1977 位
900! : 用時 .2617188 秒, 結果 2270 位
1000! : 用時 .3632813 秒, 結果 2568 位
2000! : 用時 1.53125 秒, 結果 5736 位
3000! : 用時 3.75 秒, 結果 9131 位
4000! : 用時 7.171875 秒, 結果 12674 位
5000! : 用時 11.45313 秒, 結果 16326 位
6000! : 用時 16.41016 秒, 結果 20066 位
7000! : 用時 22.83984 秒, 結果 23878 位
8000! : 用時 30.375 秒, 結果 27753 位
9000! : 用時 41.75 秒, 結果 31682 位
10000! : 用時 54.57813 秒, 結果 35660 位

這次輸出慢了些,因爲我在第一次測試10000!時,只用了47秒。不知會不會還有更快的算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章