下面的算法在 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 位
分享到:
相关推荐
阶乘 阶乘计算 大数阶乘 大整数阶乘 用数组计算阶乘
用汇编实现的大数阶乘算法,这个算法可以实现任意大的两个数相乘
大数阶乘如1000!无数据类型可以表示,用链表实现大数阶乘
计算大数阶乘,利用数组存储数据防止使用int,long,long long等存储数据溢出的情况。
用双向链表实现大数阶乘 输入一个不限制大小的数 即可计算出它的阶乘
由于计算机存储位数的限制,运用链表实现大数阶乘
用C语言编写的大数阶乘运算,有详细注释,纯C语言,可以用任何一种C编译器编译。
C# 大数阶乘 源程序 用于计算10001以下所有整数的阶乘 删除程序输入数的大小限制 理论上 可用于计算的数可以无限大
用java计算大数的阶乘,记得应该可以十秒内算出1000以内阶乘(时间很久了,大概是这样)。理论上是可以算无限大的数的阶乘的。可以作为程序设计实验课的作业。核心算法,没有赔UI。复制粘贴即可运行
该软件是闲暇之于用BCB写的一个窗口界面计算器,主要是支持大数阶乘,其他的都没啥。可以保存计算结果。
用数组来实现大数的阶乘运算,运算结果保存在一个数组中,每个数组元素村3为数字。
自己写的计算阶乘的程序,能近似计算4亿以下的数字的阶乘。并且能精确到100位以上,且可任意设置。希望对你有所帮助
在控制台界面上运用链表进行大数阶乘运算并输出
很多教材中的阶乘程序只是简单地用了阶乘的定义,算法比较简单,考虑也不够全面,其相应的程序如下 该函数在参数n比较小的时候运行完全正常,...要计算更大参数的阶乘,可以使用数组存放阶乘结果,于是有了下面的程序:
算十万的阶乘,对于计算机和程序员都是一个挑战,本源程序实现了求大数的阶乘,是用汇编写的,相对速度很快,算十万的阶乘在我赛扬2.4,内存256的神舟笔记本上,用了20多分钟.算出得数写在一个TXT文件下,十万的阶乘结果,用...
可以进行大数的运算/计算(四则运算、快速A^B%C),生成随机大素数,大数阶乘等。
这是非常快速的C#代码实现的大数相乘的程序,比如计算3000!的阶乘只要几秒即可! 是学习C#的好东西!
详细解释了怎样计算大数的阶乘,分析的比较细致,容易理解
计算大数的阶乘,并把阶乘结果转为三进制、以及二进制
常规的计算阶乘的方法是采用递归。但由于受计算机的限制,即时采用长整型也只能计算20以内的阶乘。自己写了一个计算大数乘法和阶乘的程序,感兴趣的可以看一看