Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 24s
Recursive 4-arm match on (a, b) tuples threading a carry: match (a, b) with | ([], []) -> if carry = 0 then [] else [carry] | (x :: xs, []) -> (s mod 10) :: aux xs [] (s / 10) where s = x + carry | ([], y :: ys) -> ... | (x :: xs, y :: ys) -> ... where s = x + y + carry Little-endian digit lists. Three tests: [9;9;9] + [1] = [0;0;0;1] (=1000, digit sum 1) [5;6;7] + [8;9;1] = [3;6;9] (=963, digit sum 18) [9;9;9;9;9;9;9;9] + [1] length 9 (carry propagates 8x) Sum = 1 + 18 + 9 = 28. Exercises tuple-pattern match on nested list-cons with the integer arithmetic and carry-threading idiom typical of multi-precision implementations. 52 baseline programs total.
25 lines
609 B
OCaml
25 lines
609 B
OCaml
let bigint_add a b =
|
|
let rec aux a b carry =
|
|
match (a, b) with
|
|
| ([], []) -> if carry = 0 then [] else [carry]
|
|
| (x :: xs, []) ->
|
|
let s = x + carry in
|
|
(s mod 10) :: aux xs [] (s / 10)
|
|
| ([], y :: ys) ->
|
|
let s = y + carry in
|
|
(s mod 10) :: aux [] ys (s / 10)
|
|
| (x :: xs, y :: ys) ->
|
|
let s = x + y + carry in
|
|
(s mod 10) :: aux xs ys (s / 10)
|
|
in
|
|
aux a b 0
|
|
|
|
;;
|
|
|
|
let r1 = bigint_add [9;9;9] [1] in
|
|
let r2 = bigint_add [5;6;7] [8;9;1] in
|
|
let r3 = bigint_add [9;9;9;9;9;9;9;9] [1] in
|
|
List.fold_left (+) 0 r1
|
|
+ List.fold_left (+) 0 r2
|
|
+ List.length r3
|