RosettaCodeData/Task/Left-factorials/EasyLang/left-factorials.easy
2026-04-30 12:34:36 -04:00

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."
.