用VBS精确计算100的阶乘

标签: , , ,

今天又无聊的逛了一下搜搜问问,找到这样一个问题

有谁能提供vbs里20的阶乘的详细程序

下面有人给出了这样的答案:

function jx(x)
    j=1
    for i=2 to x
        j=j*i
    next
    jx=j
end function
msgbox jx(20)

运行一下上面的程序,输出2.43290200817664E+18。笑而不语,再次证明了我之前的结论,在这种网站上回答问题的,大部分水平都不咋地。

其实之前在《用VBS精确计算2的100次方》我已经写过了VBS的大数乘法,调用一下就行了:

'Author: Demon
'Website: http://demon.tw
'Email: 380401911@qq.com
Option Explicit
Function multiple(byVal x, byVal y)
    Dim n, t, i, j, z, w()
    n = Len(x) - 1
    t = Len(y) - 1
    ReDim w(n + t + 1)

    x = CStr(x) : y = CStr(y)

    For i = 0 To UBound(w)
        w(i) = "0"
    Next    

    For i = 0 To t
        Dim c  : c = 0
        Dim uv : uv = 0

        For j = 0 To n
            uv = (w(i+j)-"0") + c + _
            (Mid(x,n-j+1,1)-"0") * (Mid(y,t-i+1,1)-"0")
            w(i+j) = CStr(uv Mod 10 + "0")
            c = uv \ 10
        Next

        w(i+n+1) = CStr(uv \ 10 + "0")
    Next

    z = Join(w,"")
    z = StrReverse(z)
    Do While Left(z,1) = "0"
        z = Mid(z,2)
    Loop

    multiple = z
End Function

Function factorial(n)
    Dim i, t : t = 1
    For i = 1 To n
        t = multiple(t, i)
    Next
    factorial = t
End Function
    
Dim t : t = Timer
WScript.Echo factorial(100)
WScript.Echo Timer - t

另外,dogfish也写了一个求1000阶乘的VBS:

dim digits(2568)
max_digit = 2568
digits(max_digit) = 1
for d=2 to 1000
     for k=max_digit to ubound(digits)
          digits(k) = digits(k) *d
     next
     k = ubound(digits)
     while k>=max_digit
          if digits(k)>10 then
               digits(k-1) = digits(k-1) + fix(digits(k) / 10)
               digits(k) = digits(k) mod 10
               if k-1<max_digit then
                    max_digit = k - 1
               end if
          end if
          k = k-1
     wend
next

'把结果转为字串。
 
str = ""
for i=max_digit to ubound(digits)
     str = str & digits(i)
next
msgbox str

不过,能写出这样的程序的人,不会无聊到去回答搜搜问问的问题吧。

随机文章:

  1. OpenWrt配置IPv6之6to4隧道
  2. VbsEdit 5.2.4.0
  3. VBS转EXE工具:VBScript2Exe
  4. 用VBS检测U盘插入和弹出事件
  5. 用VBS获取Unix时间戳

2 条评论 发表在“用VBS精确计算100的阶乘”上

  1. Passer说道:

    用教授的眼光去评价小学老师,难道忘了你也是从这种水平过来的
    专业的问题,自有专业的地方解答,人家是幼师,你管的真多啊

  2. leafyii说道:

    然而2.43290200817664E+18确实是20阶乘的精确结果
    要到28以上的阶乘,搜问的答案才会和逐位相乘转化为字符的算法产生差异
    把这文贴到其它地方,估计也会有观众笑而不语吧

留下回复