Problem Definition
You are asked to calculate factorials of some small positive integers.
Input
An integer t, 1<=t<=100, denoting the number of testcases, followed by t lines, each containing a single integer n, 1<=n<=100.
Output
For each integer n given at input, display a line with the value of n!
More details about the problem is available here.Solution
open System | |
open System.Numerics | |
let init() = Array.init 158 (fun x -> if x = 0 then 1 else 0) | |
let minLength (a:int array) : int = | |
let rec m' (a:int array) i = | |
match a.[i-1] with | |
| 0 -> m' a (i-1) | |
| _ -> i | |
in | |
m' a a.Length | |
let toString' (a:int array) = | |
let s = System.Text.StringBuilder() | |
let mLength = minLength a | |
for i=(mLength-1) downto 0 do | |
s.Append(a.[i])|>ignore | |
s.ToString() | |
let (^*) multiplier (multiplicand:int array)= | |
let rec multiplyOPT (a:int array) b i acc length= | |
let l = Math.Min(length,a.Length) | |
if i< l then | |
let r = a.[i] * b + acc | |
a.[i] <- r%10 | |
multiplyOPT a b (i+1) (r/10) length | |
else | |
a | |
in | |
multiplyOPT multiplicand multiplier 0 0 (multiplicand |>minLength |> (+) 2) | |
let factorial n = | |
let rec fac n r = | |
match n with | |
| 0 -> toString' r | |
| _ -> fac (n-1) (n^*r) | |
fac n (init()) | |
let intFactorial (i : uint64) = | |
let rec f (i:uint64) (acc:uint64) = | |
match i with | |
| 0UL -> acc | |
| i -> f (i-1UL) (acc*i) | |
in | |
f i 1UL | |
let computeFactorial (n:int) = | |
if n > 20 then | |
factorial n | |
else | |
(intFactorial (n |> uint64)).ToString(); | |
let solveSpoj24() = | |
let rec solveLines currentLine maxLines = | |
if currentLine < maxLines then | |
System.Console.ReadLine() | |
|> int | |
|> computeFactorial | |
|> printfn "%s" | |
solveLines (currentLine+1) maxLines | |
in | |
match Console.ReadLine() |> Int32.TryParse with | |
| (true, i) when i > 0 -> solveLines 0 i | |
| _ -> () | |
solveSpoj24() |