From a689f0df146a95559ef4d4ff135db1f740f22346 Mon Sep 17 00:00:00 2001 From: Daniele Fucini Date: Sat, 9 Nov 2024 22:19:21 +0100 Subject: [PATCH] Add Haskell solutions for Problem 21 --- Haskell/ProjectEuler.hs | 4 ++++ Haskell/p021.hs | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 Haskell/p021.hs diff --git a/Haskell/ProjectEuler.hs b/Haskell/ProjectEuler.hs index e3e2b69..7741a1a 100644 --- a/Haskell/ProjectEuler.hs +++ b/Haskell/ProjectEuler.hs @@ -1,6 +1,7 @@ module ProjectEuler ( isPrime , digitSum +, sumProperDivisors ) where import Data.Char (digitToInt) @@ -18,3 +19,6 @@ isPrime n = digitSum :: (Integral a, Show a) => a -> Int digitSum n = sum $ map digitToInt $ show n + +sumProperDivisors :: (Integral a) => a -> a +sumProperDivisors n = sum [ if x /= y then x + y else x | x <- [2..ceiling $ sqrt $ fromIntegral n], let y = n `div` x, n `mod` x == 0 ] + 1 diff --git a/Haskell/p021.hs b/Haskell/p021.hs new file mode 100644 index 0000000..23360c4 --- /dev/null +++ b/Haskell/p021.hs @@ -0,0 +1,23 @@ +-- Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n). +-- If d(a) = b and d(b) = a, where a ≠ b, then a and b are an amicable pair and each of a and b are called amicable numbers. +-- +-- For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110; therefore d(220) = 284. +-- The proper divisors of 284 are 1, 2, 4, 71 and 142; so d(284) = 220. +-- +-- Evaluate the sum of all the amicable numbers under 10000. + +import ProjectEuler (sumProperDivisors) + +properDivisors :: (Integral a) => a -> [a] +properDivisors n = [ x | x <- [1..n-1], n `mod` x == 0] + +amicable :: (Integral a) => a -> a -> Bool +amicable x y = x /= y && (sumProperDivisors x) == y && (sumProperDivisors y) == x + +sumAmicable :: (Integral a) => a -> a +sumAmicable n = sum [ x | x <- [1..n-1], amicable x $ sumProperDivisors x ] + +main = do + let result = sumAmicable 10000 + putStrLn $ "Project Euler, Problem 21\n" + ++ "Answer: " ++ (show result)