大数阶乘的计算(三)

原创 2004年05月30日 17:00:00

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

 

计算大数阶乘--Java版

本文给出Java语言版的计算大数阶乘的程序,本文使用动态数组的存储计算过程的中间结果和最终结果。每个short型数组元素表示4位10进制数。...
  • liangbch
  • liangbch
  • 2012年06月01日 09:41
  • 3628

ACM大数阶乘问题

解题思路: 看着题目首先想到用数组来保存数据,肯定不能用任何数据类型来保存。 想到:5!=5*4!=5*4+20*5.。。 大数阶乘 时间限制:3000 ms  |  内存限制:65535...
  • ckkboy
  • ckkboy
  • 2016年04月21日 22:18
  • 734

大数阶乘&&大数乘法

#include #include #include #include #include using namespace std; #define inf 0x3f3f3f3f int a[10005...
  • u013776243
  • u013776243
  • 2016年02月28日 20:38
  • 248

java竞赛-大数阶乘问题

Java计算阶乘(n!)需要使用实现使用BigDecimal类,因为用int最多正确算到12!,用long最多正确算到20! 计算机中提供了长整型和双精度等能存储较大数的数据类型,但在有些时候,这样...
  • LucasXu01
  • LucasXu01
  • 2015年12月06日 17:50
  • 2221

C++ 大数阶乘求取--数组实现代码

http://hi.baidu.com/urzalknsyzchrur/item/3934e84e821b7de31381da8d
  • tianzhaixing
  • tianzhaixing
  • 2014年04月14日 21:13
  • 1417

大数的阶乘算法

用data数组来存放阶乘的每一位数字,首先令第一位的数值为1,位数为1,然后将每次相乘的乘积存回数组,并循环处理每个数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加...
  • petershina
  • petershina
  • 2015年04月16日 09:08
  • 3969

C语言 求一个大数的阶乘

C语言 求一个大数的阶乘 void BigFactorial(int m) { static int a[50000]={0,1};//第一位不用 int i,j,carry,tmp,lenth...
  • lcytrl
  • lcytrl
  • 2012年10月08日 11:08
  • 5188

几种大数阶乘算法效率比较(Java)

完整代码:package bigdatamul;import java.math.BigInteger; /** * 大数阶乘 * * @Description: TODO(大数阶乘) * ...
  • rickiyeat
  • rickiyeat
  • 2016年12月20日 09:50
  • 1138

大整数阶乘的java实现

在实现K2算法时,用到了阶乘,如果数据量过大,普通阶乘会导致溢出,所以需要用到大整数阶乘。 public class BigIntegerArr { /** * 计算进位 * * @...
  • fine9283530
  • fine9283530
  • 2016年09月23日 17:02
  • 955

大数阶乘详解

题目链接:点击打开链接 注:详解大数阶乘,希望对有需要的人有帮助。 大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述我们都知道如何计算一个数的阶乘...
  • qq_40510246
  • qq_40510246
  • 2017年11月17日 18:18
  • 106
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大数阶乘的计算(三)
举报原因:
原因补充:

(最多只允许输入30个字)