Skip to content

Instantly share code, notes, and snippets.

@SergiyOsadchyy
Last active June 12, 2018 14:21
Show Gist options
  • Select an option

  • Save SergiyOsadchyy/3381eb676b13134fc30f27b71280453c to your computer and use it in GitHub Desktop.

Select an option

Save SergiyOsadchyy/3381eb676b13134fc30f27b71280453c to your computer and use it in GitHub Desktop.
Напишите программу, которая возвращает наибольшее число палиндром, которое является произведением двух простых пятизначных чисел, а также возвращает сами сомножители. Простое число - это натуральное число, которое делится нацело только на 1 и на себя само (2, 3, 5, 7, 11, …) Палиндром – строка, которая читается одинаково в обоих направлениях (на…
module Palindrome where
{- Напишите программу, которая возвращает наибольшее число палиндром,
которое является произведением двух простых пятизначных чисел, а также возвращает сами сомножители.
Простое число - это натуральное число, которое делится нацело только на 1 и на себя само (2, 3, 5, 7, 11, …)
Палиндром – строка, которая читается одинаково в обоих направлениях (например ABBA) -}
main = maximum [(x*y, x, y) | x <- prime5digitNumbers, y <- prime5digitNumbers, isPalindrome (x * y)]
where
prime5digitNumbers = [p5dn | p5dn <- [last5digtNumber, (last5digtNumber - 1)..first5digtNumber], isPrime p5dn]
first5digtNumber = 10000
last5digtNumber = 99999
--first5digtNumber = head [f | f <- [1..], digits f == 5]
--last5digtNumber = head [f | f <- [1..], digits f == 6] - 1
isPrime :: (Integral a) => a -> Bool
isPrime k = null [ x | x <- [2..k-1], mod k x == 0 ]
isPalindrome :: Integer -> Bool
isPalindrome n = palin n (digits n)
where
palin x dgts
| x < 0 = False
| x == 0 = True
| x < 10 = dgts == 1
| otherwise = q == x `mod` 10 && palin inner (dgts-2)
where
inner = r `div` 10
(q,r) = x `divMod` size
size = 10^(dgts-1)
digits :: Integer -> Integer
digits x
| x < 10 = 1
| otherwise = 1 + digits (x `div` 10)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment