ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何实现用vba代码计算超大数的阶乘?

如何实现用vba代码计算超大数的阶乘?

作者:绿色风 分类: 时间:2022-08-17 浏览:149
楼主
kevinchengcw
Q: 如何实现用vba代码计算超大数的阶乘?
A: 代码如下:
  1. Sub test()
  2. Dim Arr, N&, Str$, T&, I&
  3. ReDim Arr(1 To 1)  '定义结果数组
  4. Arr(1) = 1  '初始化第一个阶乘数字到数组中
  5. T = 0  '初始化溢出值(超出8位的临时储存变量)
  6. For N = 2 To 500  '本例计算1到500的阶乘
  7.     For I = 1 To UBound(Arr)    '内循环用于计算数组各数段的相乘结果
  8.         If Val(Arr(I)) = 0 Then  '如果数组项内容的数值为0,即8位都是0的情况
  9.             Arr(I) = "00000000"  '依然赋值为8个0
  10.         Else  '否则
  11.             Arr(I) = Format(Val(Arr(I)) * N + T, "###00000000")  '将计算结果加上上一个数据段相乘后溢出的数值
  12.             Str = Arr(I)  '赋值给变量,用于再拆分成8个一段
  13.             T = 0  '清空溢出段原值,用于存储后期溢出的内容
  14.             If Len(Str) > 8 Then  '判断相乘的结果是否大于8位,如果是,则
  15.                 T = Val(Left(Str, Len(Str) - 8))  '溢出段取去掉后8位的值
  16.                 Arr(I) = Val(Right(CStr(Arr(I)), 8))  '数组当前值取后面8位
  17.             End If
  18.             If I = UBound(Arr) And T <> 0 Then  '如果内循环完成时溢出位不为0,即超出数组上限时,重定义数组,保留原有数据,并将溢出值赋值给新添加的数组项,清空溢出值
  19.                 ReDim Preserve Arr(1 To UBound(Arr) + 1)
  20.                 Arr(UBound(Arr)) = T
  21.                 T = 0
  22.             End If
  23.         End If
  24.     Next I
  25. Next N
  26. Str = ""  '初始化结果字段为空
  27. For N = UBound(Arr) To LBound(Arr) Step -1   '从最高向最低循环数组来串拉数据
  28.     If N = UBound(Arr) Then  '最高位取数值,去掉前方无意义的0
  29.         Str = Val(Arr(N))
  30.     Else
  31.         Str = Str & CStr(Arr(N))  '后面的直接串接
  32.     End If
  33. Next N
  34. Debug.Print Str  '显示结果
  35. End Sub
理论上讲,在电脑许可的情况下可以输出任意大的数字的阶乘.
2楼
yjzstar
跟K哥学VBA

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap