Microsoft Small Basic

Program Listing: HHW468
' Factorial
' Copyright (c) 2012 Nonki Takahashi

t0 = Clock.ElapsedMilliseconds
DIGITS = 13 ' separate big number to avoid overflow within this digits
COMMA = ""
n = 100
ans = 1
For i = 1 to n
a = ans
b = i
Mul() ' c = a * b
ans = c
EndFor
TextWindow.Write(n + "!=")
x = c
PrintWithComma()
t1 = Clock.ElapsedMilliseconds
TextWindow.WriteLine("(" + (t1 - t0) + "ms)")
' end of program

' const DIGITS = 13
' param a
' param b
' return c = a * b
Sub Mul
Stack.PushValue("param", a)
Stack.PushValue("param", b)
Stack.PushValue("param", i)
Stack.PushValue("param", n)
a[0] = a
b[0] = b
l = Text.GetLength(a[0])
m = Math.Ceiling(l / DIGITS)
l = Math.Remainder(l, DIGITS)
If l = 0 Then
l = DIGITS
EndIf
s = 1
For j = 1 To m
a[j] = Text.GetSubText(a[0], s, l)
s = s + l
l = DIGITS
EndFor
l = Text.GetLength(b[0])
n = Math.Ceiling(l / DIGITS)
l = Math.Remainder(l, DIGITS)
If l = 0 Then
l = DIGITS
EndIf
s = 1
For i = 1 To n
b[i] = Text.GetSubText(b[0], s, l)
s = s + l
l = DIGITS
EndFor
For k = 1 To n + m
c[k] = 0
EndFor
For i = 1 To n
For j = 1 To m
x = a[j] * b[i]
c[i + j - 1] = c[i + j - 1] + Math.Floor(x / Math.Power(10, DIGITS))
c[i + j] = c[i + j] + Math.Remainder(x, Math.Power(10, DIGITS))
For k = i + j To 2 Step -1
If c[k] >= Math.Power(10, DIGITS) Then
carry = Math.Floor(c[k] / Math.Power(10, DIGITS))
c[k] = Math.Remainder(c[k], Math.Power(10, DIGITS))
c[k - 1] = c[k - 1] + carry
EndIf
EndFor
EndFor
EndFor
c[0] = ""
If c[1] > 0 Then
c[0] = Text.Append(c[0], c[1])
EndIF
For k = 2 To n + m
If Text.GetLength(c[k]) < DIGITS Then
For i = 1 To DIGITS - Text.GetLength(c[k])
If c[0] <> "" Then
c[0] = Text.Append(c[0], "0")
EndIF
EndFor
EndIf
c[0] = Text.Append(c[0], c[k])
EndFor
c = c[0]
n = Stack.PopValue("param")
i = Stack.PopValue("param")
b = Stack.PopValue("param")
a = Stack.PopValue("param")
EndSub

' const COMMA = "," or "." or " " or "" etc.
' param x
Sub PrintWithComma
l = Text.GetLength(x)
n = Math.Ceiling(l / 3)
l = Math.Remainder(l, 3)
If l = 0 Then
l = 3
EndIf
s = 1
For i = 1 To n
TextWindow.Write(Text.GetSubText(x, s, l))
If i < n Then
TextWindow.Write(COMMA)
EndIf
s = s + l
l = 3
EndFor
TextWindow.WriteLine("")
EndSub