fork download
  1. --
  2. -- addition of very long integers
  3. --
  4.  
  5. import Data.Char
  6. import Data.String
  7.  
  8. addRev [] [] 0 = []
  9. addRev la [] c = addRev la [0] c
  10. addRev [] lb c = addRev [0] lb c
  11. addRev (a:la) (b:lb) c = q : (addRev la lb p) where (p,q) = divMod (a+b+c) 10
  12.  
  13. add la lb = reverse (addRev (reverse la) (reverse lb) 0)
  14.  
  15. stringToDigits s = map digitToInt s
  16. digitsToString l = map intToDigit l
  17. intToDigits n = map digitToInt (show n)
  18. digitsToInt :: [Int] -> Integer
  19. digitsToInt s = read (digitsToString s)
  20.  
  21. verifyAdd m n = ((digitsToInt (add (intToDigits m) (intToDigits n))) - (m+n)) == 0
  22.  
  23. main = do print (digitsToString (add (stringToDigits "67544539703981792301876431982341329878656543656") (stringToDigits "923409765450275928347539864398234659")))
  24. print (all (id) [verifyAdd x y | x <- [12000..13000], y <- [7500..8500]])
Success #stdin #stdout 10.34s 3716KB
stdin
Standard input is empty
stdout
"67544539704905202067326707910688869743054778315"
True