作者:绿色风
分类:
时间:2022-08-17
浏览:149
楼主 kevinchengcw |
Q: 如何实现用vba代码计算超大数的阶乘? A: 代码如下:
- Sub test()
- Dim Arr, N&, Str$, T&, I&
- ReDim Arr(1 To 1) '定义结果数组
- Arr(1) = 1 '初始化第一个阶乘数字到数组中
- T = 0 '初始化溢出值(超出8位的临时储存变量)
- For N = 2 To 500 '本例计算1到500的阶乘
- For I = 1 To UBound(Arr) '内循环用于计算数组各数段的相乘结果
- If Val(Arr(I)) = 0 Then '如果数组项内容的数值为0,即8位都是0的情况
- Arr(I) = "00000000" '依然赋值为8个0
- Else '否则
- Arr(I) = Format(Val(Arr(I)) * N + T, "###00000000") '将计算结果加上上一个数据段相乘后溢出的数值
- Str = Arr(I) '赋值给变量,用于再拆分成8个一段
- T = 0 '清空溢出段原值,用于存储后期溢出的内容
- If Len(Str) > 8 Then '判断相乘的结果是否大于8位,如果是,则
- T = Val(Left(Str, Len(Str) - 8)) '溢出段取去掉后8位的值
- Arr(I) = Val(Right(CStr(Arr(I)), 8)) '数组当前值取后面8位
- End If
- If I = UBound(Arr) And T <> 0 Then '如果内循环完成时溢出位不为0,即超出数组上限时,重定义数组,保留原有数据,并将溢出值赋值给新添加的数组项,清空溢出值
- ReDim Preserve Arr(1 To UBound(Arr) + 1)
- Arr(UBound(Arr)) = T
- T = 0
- End If
- End If
- Next I
- Next N
- Str = "" '初始化结果字段为空
- For N = UBound(Arr) To LBound(Arr) Step -1 '从最高向最低循环数组来串拉数据
- If N = UBound(Arr) Then '最高位取数值,去掉前方无意义的0
- Str = Val(Arr(N))
- Else
- Str = Str & CStr(Arr(N)) '后面的直接串接
- End If
- Next N
- Debug.Print Str '显示结果
- End Sub
理论上讲,在电脑许可的情况下可以输出任意大的数字的阶乘. |
2楼 yjzstar |
跟K哥学VBA |
免责声明
有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素,
经与ExcelTip.Net站长Apolloh商议并征得其同意,
现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示,
供有需要的人士查询使用,也慰缅曾经的论坛时代。
所示各个帖子的原作者如对版权有异议,
可与本人沟通提出,或于本站点留言,我们会尽快处理。
在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一