aboutsummaryrefslogtreecommitdiff
path: root/problem3.erl
blob: 3d8a3b36b4c5e6d141912fabc2fa7b62dcefa437 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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.