RosettaCodeData/Task/Left-factorials/Phix/left-factorials.phix
2019-09-12 10:33:56 -07:00

29 lines
837 B
Text

include mpfr.e
sequence lf_list
procedure init(integer n)
mpz f = mpz_init(1)
lf_list = repeat(f,n+1)
for i=1 to n do
f = mpz_init_set(f)
mpz_mul_si(f,f,i)
lf_list[i+1] = f
end for
end procedure
function lf(integer n, bool len=false)
-- Returns left factorial of n, or it's length, as a string
mpz sumf = mpz_init(0)
for k=1 to n do mpz_add(sumf,sumf,lf_list[k]) end for
return iff(len?sprintf("%d",mpz_sizeinbase(sumf,10))
:mpz_get_str(sumf))
end function
-- Main procedure
atom t0 = time()
init(10000)
for i=0 to 10 do printf(1,"!%d = %s\n",{i,lf(i)}) end for
for i=20 to 110 by 10 do printf(1,"!%d = %s\n",{i,lf(i)}) end for
for i=1000 to 10000 by 1000 do printf(1,"!%d contains %s digits\n",{i,lf(i,true)}) end for
printf(1,"complete (%3.2fs)\n",{time()-t0})