mirror of
https://github.com/correl/euler.git
synced 2024-11-23 19:19:53 +00:00
Haskell 004
This commit is contained in:
parent
2c0a857bd4
commit
ab80499b45
1 changed files with 32 additions and 0 deletions
32
haskell/e004.hs
Normal file
32
haskell/e004.hs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
{- Find the largest palindrome made from the product of two 3-digit numbers.
|
||||||
|
|
||||||
|
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 99.
|
||||||
|
Find the largest palindrome made from the product of two 3-digit numbers.
|
||||||
|
-}
|
||||||
|
|
||||||
|
import Data.List (nub, sort)
|
||||||
|
import Text.Printf
|
||||||
|
|
||||||
|
is_palindrome :: (Integral a) => a -> Bool
|
||||||
|
is_palindrome n = do
|
||||||
|
let s = (show n)
|
||||||
|
s == (reverse s)
|
||||||
|
|
||||||
|
largest_palindrome :: (Integral a) => a -> a
|
||||||
|
largest_palindrome digits = do
|
||||||
|
let min = 10 ^ (digits - 1)
|
||||||
|
let max = 10 ^ digits - 1
|
||||||
|
largest_palindrome_ min max max max 0
|
||||||
|
|
||||||
|
largest_palindrome_ :: (Integral a) => a -> a -> a -> a -> a -> a
|
||||||
|
largest_palindrome_ min max a b p
|
||||||
|
| a < min = p
|
||||||
|
| a * b < p || b < min = largest_palindrome_ min max (a - 1) max p
|
||||||
|
| otherwise =
|
||||||
|
if is_palindrome (a * b)
|
||||||
|
then largest_palindrome_ min max a (b - 1) (a * b)
|
||||||
|
else largest_palindrome_ min max a (b - 1) p
|
||||||
|
|
||||||
|
main = do
|
||||||
|
printf "Largest palindrome product of 2-digit numbers: %d\n" (largest_palindrome 2 :: Integer)
|
||||||
|
printf "Largest palindrome product of 3-digit numbers: %d\n" (largest_palindrome 3 :: Integer)
|
Loading…
Reference in a new issue