From 0248ed34ce3d05228bc5084669c3a27933be0c2e Mon Sep 17 00:00:00 2001 From: Nathan Lasseter Date: Sun, 4 Oct 2009 00:56:56 +0100 Subject: first commit --- problem3.erl | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100755 problem3.erl (limited to 'problem3.erl') diff --git a/problem3.erl b/problem3.erl new file mode 100755 index 0000000..3d8a3b3 --- /dev/null +++ b/problem3.erl @@ -0,0 +1,50 @@ +-module(problem3). +-export([solve/0]). + +solve() -> whittle(600851475143,[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97],1). + +whittle(Num,List,Max) -> + Q = will_divide(Num, List), + if + Num =:= 1 -> + Max; + Q -> + H = which_divides(Num,List), + if + H > Max -> + whittle(Num div H, List, H); + true -> + whittle(Num div H, List, Max) + end; + true -> + whittle(Num, gen_next(List), Max) + end. + + +gen_next(List) -> + gen_next(List, lists:max(List) + 1). +gen_next(List, Next) -> + Q = will_divide(Next, List), + if + Q -> + gen_next(List, Next + 1); + true -> + List ++ [Next] + end. + +will_divide(_, []) -> + false; +will_divide(Num, [H|T]) -> + if + Num rem H =:= 0 -> + true; + true -> + will_divide(Num, T) + end. +which_divides(Num, [H|T]) -> + if + Num rem H =:= 0 -> + H; + true -> + which_divides(Num, T) + end. -- cgit v1.2.1