Project Euler #012
The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... Let us list the factors of the first seven triangle numbers:
1: 1
3: 1,3
6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28
We can see that 28 is the first triangle number to have over five divisors. What is the value of the first triangle number to have over five hundred divisors?
let rec triangle_number order =
if order = 0 then order else order + triangle_number (order - 1)
let rec get_divisors n (i:int) (divisors:list<int>) =
if i < (n / 2) then
if (n % i) = 0 then
get_divisors n (i + 1) (i :: divisors)
else
get_divisors n (i + 1) divisors
else
divisors
let rec find_triangle_number order number_of_divisors =
let divisors = (get_divisors (triangle_number order) 1 []).Length
if divisors > number_of_divisors then
order
else
find_triangle_number (order + 1) number_of_divisors
// This is an expensive operation
(find_triangle_number 1 500) |> triangle_number
comments powered by Disqus