RosettaCodeData/Task/Left-factorials/FreeBASIC/left-factorials.basic

44 lines
814 B
Plaintext

' FB 1.05.0 Win64
#include "gmp.bi"
Sub leftFactorial(rop As __mpz_struct, op As ULong)
Dim As __mpz_struct t1
mpz_init_set_ui(@t1, 1)
mpz_set_ui(@rop, 0)
For i As ULong = 1 To op
mpz_add(@rop, @rop, @t1)
mpz_mul_ui(@t1, @t1, i)
Next
mpz_clear(@t1)
End Sub
Function digitCount(op As __mpz_struct) As ULong
Dim As ZString Ptr t = mpz_get_str(0, 10, @op)
Dim As ULong ret = Len(*t)
Deallocate(t)
Return ret
End Function
Dim As __mpz_struct t
mpz_init(@t)
For i As ULong = 0 To 110
If i <= 10 OrElse i Mod 10 = 0 Then
leftFactorial(t, i)
gmp_printf(!"!%u = %Zd\n", i, @t)
End If
Next
Print
For i As ULong = 1000 To 10000 Step 1000
leftFactorial(t, i)
Print "!"; Str(i); " has "; digitCount(t); " digits"
Next
mpz_clear(@t)
Print
Print "Press any key to quit"
Sleep