Skip to content

Instantly share code, notes, and snippets.

@wangbj
Created June 12, 2021 17:11
Show Gist options
  • Save wangbj/13a8e758fc9eea675de0ebfd5492d8bd to your computer and use it in GitHub Desktop.
Save wangbj/13a8e758fc9eea675de0ebfd5492d8bd to your computer and use it in GitHub Desktop.
multiS.hs
import Data.Ord
import Data.Char
padLeft xs x k = replicate k x ++ xs
padRight xs x k = xs ++ replicate k x
addHelper xs = fixer . foldr go (0, []) . zip xs
where go (x, y) (carry, zs) | t >= 10 = (1, chr (t - 10 + ord '0'): zs)
| t < 10 = (0, chr (t + ord '0'): zs)
where t = ord x - ord '0' + ord y - ord '0' + carry
fixer (0, xs) = xs
fixer (1, xs) = '1' : xs
addString xs [] = xs
addString [] ys = ys
addString xs ys
| length xs < length ys = addString ys xs
| length xs >= length ys = addHelper xs (padLeft ys '0' (length xs - length ys))
multi1 xs k
| k == 0 = []
| k == 1 = xs
| k == 2 = addString xs xs
| k == 3 = addString xs (multi1 xs 2)
| k == 4 = addString (multi1 xs 2) (multi1 xs 2)
| k == 5 = addString (multi1 xs 2) (multi1 xs 3)
| k == 6 = addString (multi1 xs 3) (multi1 xs 3)
| k == 7 = addString (multi1 xs 3) (multi1 xs 4)
| k == 8 = addString (multi1 xs 4) (multi1 xs 4)
| k == 9 = addString (multi1 xs 4) (multi1 xs 5)
multiString xs [] = []
multiString [] ys = ys
multiString xs ys
| length xs < length ys = multiString ys xs
| length xs >= length ys = snd $ foldr go (0, []) ys
where go y (k, zs) = (1 + k, addString zs (padRight (multi1 xs (ord y - ord '0')) '0' k))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment