66 lines
1.4 KiB
Text
66 lines
1.4 KiB
Text
func[] bn s$ .
|
|
i = len s$ - 7 + 1
|
|
while i >= -5
|
|
r[] &= number substr s$ i 7
|
|
i -= 7
|
|
.
|
|
return r[]
|
|
.
|
|
func$ bns bn[] .
|
|
s$ = bn[$]
|
|
for i = len bn[] - 1 downto 1
|
|
h$ = bn[i]
|
|
s$ &= substr "0000000" 1 (7 - len h$) & h$
|
|
.
|
|
return s$
|
|
.
|
|
func[] bnmul a[] b[] .
|
|
len r[] len a[] + len b[]
|
|
if len a[] > len b[] : swap a[] b[]
|
|
for ia = 1 to len a[]
|
|
h = 0
|
|
for ib = 1 to len b[]
|
|
h += r[ia + ib - 1] + b[ib] * a[ia]
|
|
r[ia + ib - 1] = h mod 10000000
|
|
h = h div 10000000
|
|
.
|
|
r[ia + ib - 1] += h
|
|
.
|
|
while r[$] = 0 and len r[] > 1 : len r[] -1
|
|
return r[]
|
|
.
|
|
func[] bnadd a[] b[] .
|
|
if len b[] > len a[] : swap a[] b[]
|
|
len r[] len a[]
|
|
for i = 1 to len r[]
|
|
v = 0
|
|
if i <= len b[] : v = b[i]
|
|
h += a[i] + v
|
|
r[i] = h mod 10000000
|
|
h = h div 10000000
|
|
.
|
|
if h > 0 : r[] &= h
|
|
while len r[] > 1 and r[$] = 0 : len r[] -1
|
|
return r[]
|
|
.
|
|
#
|
|
func[] left_factorial n .
|
|
if n = 0 : return [ 0 ]
|
|
fact[] = [ 1 ]
|
|
sum[] = fact[]
|
|
for i = 1 to n - 1
|
|
fact[] = bnmul fact[] [ i ]
|
|
sum[] = bnadd sum[] fact[]
|
|
.
|
|
return sum[]
|
|
.
|
|
for i = 0 to 110
|
|
if i < 10 or i mod 10 = 0
|
|
print "!" & i & " = " & bns left_factorial i
|
|
.
|
|
.
|
|
print ""
|
|
for i = 1000 step 1000 to 10000
|
|
a$ = bns left_factorial i
|
|
print "!" & i & " has " & len a$ & " digits."
|
|
.
|