reciprocal :: Int -> (String, Int) reciprocal n | n > 1 = ('0' : '.' : digits, recur) | otherwise = error "attempting to compute reciprocal of number <= 1" where (digits, recur) = divide n 1 [] divide :: Int -> Int -> [Int] -> (String, Int) divide n c cs | c `elem` cs = ([], position c cs) | r == 0 = (show q, 0) | r /= 0 = (show q ++ digits, recur) where (q, r) = (c*10) `quotRem` n (digits, recur) = divide n r (c:cs) position :: Int -> [Int] -> Int position n (x:xs) | n == x = 1 | otherwise = 1 + position n xs showRecip :: Int -> String showRecip n = "1/" ++ show n ++ " = " ++ if r == 0 then d else take p d ++ "(" ++ drop p d ++ ")" where p = length d - r (d, r) = reciprocal n main = do n <- readLn putStrLn (showRecip n) main