42 lines
1.2 KiB
Haskell
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
|