首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
iiprogram (69)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
coofucoo (105)
Drate (69)
lphpc (30)
CSDN - 文档中心 - Visual Basic 阅读:9342   评论: 8    参与评论
标题   大数阶乘的计算(三)     选择自 northwolves 的 Blog
关键字   数组 阶乘
出处  

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

 


相关文章
对该文的评论
CSDN 网友 ( 2004-07-27)
这儿有一个程序,就是会溢出:
(defun wow(n)
  (cond((eq n 0)1)
       (t
       (* n (wow(- n
       1))))))
shines ( 2004-06-06)
C固然比VB快3到5倍,但算法才是重要的,最简单的就是你们的程序都是基于10的,应该考虑base(基于)10000, base1000000000的,如果C还可以嵌入汇编,MMX+, SSE,SSE2等优化

sjk131和liangbch(宝宝)的程序的确很快,我的程序(C的)
10000! == 0.960s 遗憾的是,而且我是基于2进制的,输出10进制的结果还要转换:(

目前还在赶超之中。。。
northwolves ( 2004-06-04)
to liangbch :

你的程序下载不了。算法是 C 语言的强项,VB自然望尘莫及,但有好的思路还是能大大提速的,希望能提供一些更好的建议。
liangbch ( 2004-06-04)
我用c/c++写了一个计算大数阶乘的程序,发表于本站 http://www.csdn.net/cnshare/soft/19/19260.shtm,在PIII  733  的电脑上,速度如下:
                    10000!      30000!      100000!
    1.0版          4.93s          50.71s        787.45
    1.1版          1.41s          14.46s        184.15s
    1.2版          0.77s          7.91s          191.94s
    2.0版          0.20s          2.26s          33.28s    (中级算法)
    3.0版          0.07s          0.55s          3.98s    (高级算法)
liangbch ( 2004-06-04)
我用c/c++写了一个计算大数阶乘的程序,发表于本站 http://www.csdn.net/cnshare/soft/19/19260.shtm,在PIII  733  的电脑上,速度如下:
                    10000!      30000!      100000!
    1.0版          4.93s          50.71s        787.45
    1.1版          1.41s          14.46s        184.15s
    1.2版          0.77s          7.91s          191.94s
    2.0版          0.20s          2.26s          33.28s    (中级算法)
    3.0版          0.07s          0.55s          3.98s    (高级算法)