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?
In [1]:
$fac = (0..9).to_a.map {|i| i.downto(1).inject &:* }
$fac[0] = 1
$fac
Out[1]:
In [2]:
def factorial_decompose(num)
num.to_s.split("").map{|i| $fac[i.to_i]}.inject &:+
end
In [20]:
def find_factorial_chain(num)
result = []
result << num
decompose = factorial_decompose(num)
while decompose != num
result << decompose
decompose = factorial_decompose(decompose)
return result.count + 1 - 1 if result[1..-1].include? decompose
end
return result.count - 1
end
In [21]:
factorial_decompose(145)
Out[21]:
In [22]:
find_factorial_chain 871
Out[22]:
In [30]:
(1..1_000_000).count{|i| find_factorial_chain(i) == 60 }
Out[30]: