大数阶乘的计算(一)

原创 2004年05月30日 16:58:00

整数n的阶乘指 1*2*3*...*(n-1)*n 的值,在n=171时,计算机一般会出错(“溢出”),本文采用字符串模拟数字乘法运算,使计算10000!成为可能:

Function multi(ByVal X As String, ByVal Y As String) As String 'multi of two huge hexnum(两个大数之积)
Dim result As Variant
Dim xl As Long, yl As Long, temp As Long, i As Long
xl = Len(Trim(X))
yl = Len(Trim(Y))
 
ReDim result(1 To xl + yl)
For i = 1 To xl
For temp = 1 To yl
result(i + temp) = result(i + temp) + Val(Mid(X, i, 1)) * Val(Mid(Y, temp, 1))
Next
Next

For i = xl + yl To 2 Step -1
temp = result(i) / 10
result(i) = result(i) Mod 10
result(i - 1) = result(i - 1) + temp
Next

If result(1) = "0" Then result(1) = ""
multi = Join(result, "")
Erase result

End Function

Private Sub Command1_Click() '节约时间,算到1000!
For i = 1 To 9
calcfactorial i * 100
Next
End Sub


Sub calcfactorial(ByVal n As Integer)
Dim a() As String, i As Long, stimer As Double
ReDim a(1 To n)
a(1) = 1
stimer = Timer
For i = 2 To n
a(i) = multi(a(i - 1), i)
Next
Debug.Print n & "! : 用时 "; Timer - stimer & " 秒, 结果 " & Len(a(n)) & " 位"
Debug.Print a(n)
End Sub


100! : 用时 4.67617187496217E-02 秒, 结果 158 位
200! : 用时 .407124999999724 秒, 结果 375 位
300! : 用时 1.00012499999957 秒, 结果 615 位
400! : 用时 1.92199999999957 秒, 结果 869 位
500! : 用时 3.14013671875 秒, 结果 1135 位
600! : 用时 4.68677343750005 秒, 结果 1409 位
700! : 用时 6.64099999999962 秒, 结果 1690 位
800! : 用时 8.9208984375 秒, 结果 1977 位
900! : 用时 11.5000117187501 秒, 结果 2270 位
1000! : 用时 14.5621367187496 秒, 结果 2568 位

 

大数运算(7)——大数阶乘(求阶乘)

对于大数来说,一个数的阶乘是非常大的,同样,一个int类型的整数,他的阶乘就有可能会很大。 就拿50来说,他的阶乘位数是65位,就已经远远超过了long long int类型的最大值。这时候,我们要...
  • lisp1995
  • lisp1995
  • 2016年09月01日 21:22
  • 1415

求大数阶乘算法(华为2015面试题)

求大数阶乘算法 华为2015面试题
  • duan19920101
  • duan19920101
  • 2016年03月30日 15:34
  • 1185

np问题(大数阶乘取模)

np问题题目描述: LYK 喜欢研究一些比较困难的问题,比如 np 问题。 这次它又遇到一个棘手的 np 问题。问题是这个样子的:有两个数 n 和 p,求 n 的阶乘对 p 取模后的结果。 LY...
  • cax1165
  • cax1165
  • 2016年11月06日 15:14
  • 1926

计算大数阶乘

  • 2012年05月30日 15:13
  • 601B
  • 下载

计算大数阶乘--Linux Bash版

## 版本1,普通的实现,没有调用任何第三方程序 ## -------------------------------------------- #!/bin/bash echo To ...
  • liangbch
  • liangbch
  • 2012年05月30日 17:21
  • 2083

大数,高精度计算---大数阶乘

大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。 一般情况下大数的存储是采用字...
  • hitwhylz
  • hitwhylz
  • 2013年08月02日 01:19
  • 3176

计算大数阶乘--VB Script 版

和Basic版相比,这个版本有以下几处不同点 这次采用的不是静态数组,而是动态数组,先定义一个数组“Dim buff()”,在运行过程中再根据需要扩展大小。 计算结果没有直接输出,而是写到文件,因...
  • liangbch
  • liangbch
  • 2012年05月30日 17:18
  • 1352

4-10 阶乘计算升级版 (20分)(大数乘法)

本题要求实现一个打印非负整数阶乘的函数。函数接口定义:void Print_Factorial ( const int N ); 其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函...
  • so_so_y
  • so_so_y
  • 2017年03月13日 17:11
  • 245

WV.24-大数阶乘算法4-近似计算之二

近似计算之二   在《阶乘之计算从入门到精通-近似计算之一》中,我们采用两个数来表示中间结果,使得计算的范围扩大到1千万,并可0.02秒内完成10000000!的计算。在保证接近16位有效...
  • MIKASA3
  • MIKASA3
  • 2015年01月30日 22:00
  • 533

使用链表进行大数阶乘的计算

使用链表进行大数阶乘的计算。
  • zwjoo
  • zwjoo
  • 2016年09月18日 17:36
  • 240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大数阶乘的计算(一)
举报原因:
原因补充:

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