42 lines
1.2 KiB
Haskell

-- A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:
--
-- 1/2 = 0.5
-- 1/3 = 0.(3)
-- 1/4 = 0.25
-- 1/5 = 0.2
-- 1/6 = 0.1(6)
-- 1/7 = 0.(142857)
-- 1/8 = 0.125
-- 1/9 = 0.(1)
-- 1/10 = 0.1
--
-- Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.
--
-- Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.
removeFactor :: (Integral a) => a -> a -> a
removeFactor f n
| n `mod` f /= 0 = n
| otherwise = removeFactor f (n `div` f)
findCycleLengthRecursive :: (Integral a) => a -> a -> a -> a
findCycleLengthRecursive n j k
| n == 1 = 0
| k `mod` n == 0 = j
| otherwise = findCycleLengthRecursive n (j + 1) (k * 10 + 9)
findCycleLength :: (Integral a) => a -> a
findCycleLength n = findCycleLengthRecursive ((removeFactor 2 . removeFactor 5) n) 1 9
maxRepeatingCycle :: (Integral a) => a -> a -> a
maxRepeatingCycle a b = snd . maximum $ zip xs [1 ..]
where
xs = map findCycleLength [a .. b]
main = do
let result = maxRepeatingCycle 1 999
putStrLn $
"Project Euler, Problem 26\n"
++ "Answer: "
++ show result