(* The number 145 is well known for the property that the sum of the factorial of its digits is equal to 145: 1! + 4! + 5! = 1 + 24 + 120 = 145 Perhaps less well known is 169, in that it produces the longest chain of numbers that link back to 169; it turns out that there are only three such loops that exist: 169 -> 363601 -> 1454 -> 169 871 -> 45361 -> 871 872 -> 45362 -> 872 It is not difficult to prove that EVERY starting number will eventually get stuck in a loop. For example, 69 -> 363600 -> 1454 -> 169 -> 363601 (-> 1454) 78 -> 45360 -> 871 -> 45361 (-> 871) 540 -> 145 (-> 145) Starting with 69 produces a chain of five non-repeating terms, but the longest non-repeating chain with a starting number below one million is sixty terms. How many chains, with a starting number below one million, contain exactly sixty non-repeating terms? *) let rec fact x = if( x<2 ) then 1 else x*(fact (x-1)) ;; let rec digits x = if( x<10 ) then [x] else (x mod 10)::(digits (x/10)) ;; (* sum of digits factorials *) let sodf x = List.fold_left (+) 0 (List.map fact (digits x));; let search = (* number of unique terms, <=60 *) let rec len x i l = if(i>60) then 0 else if(List.mem x l) then i else len (sodf x) (i+1) (x::l) in let rec search x n = if(x>999999) then n else search (x+1) (if( (len x 0 []) = 60 ) then (n+1) else n) in search 1 0 ;; Printf.printf "%d\n" search;