Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Soucin dlouhych cisel
- -- parametry: znamenko (1/-1), cifry [Int], pozice des. carky od 1. cifry
- -- test -123.14*1.2: multBig (-1,[1,2,3,1,4],3) (1,[1,2],1)
- type BigNum = (Int, [Int], Int)
- multBig :: BigNum -> BigNum -> BigNum
- multBig (sign1,s1,d1) (sign2,s2,d2) = (sign1 * sign2, finalNum, finalD)
- where finalNum = reverse $ multB (reverse s1) (reverse s2) 0
- finalD = length finalNum - (length s1 - d1 + length s2 - d2)
- -- Vynasobi dva otocene seznamy cisel
- -- parametry: prvni seznam (odzadu), ukrajujici se druhy seznam (odzadu), posunuti od zacatku
- multB :: [Int] -> [Int] -> Int -> [Int]
- multB _ [] _ = []
- multB s1 (n:ns) p = normNums [a+b | (a,b) <- zipPlus line otherLines] 0
- where line = [0|_<-[1..p]] ++ multByNum s1 n
- otherLines = multB s1 ns (p+1)
- -- Vynasobi seznam cislem
- multByNum :: [Int] -> Int -> [Int]
- multByNum s n =
- let nums = [n*x | x <- s]
- in normNums nums 0
- -- Posle dal desitkove prebytky (druhy parametr = preteceni)
- normNums :: [Int] -> Int -> [Int]
- normNums [] 0 = []
- normNums [] n = [n]
- normNums (x:xs) n = ((x+n) `mod` 10) : (normNums xs ((x+n) `div` 10))
- -- zipPlus - jako zip (udela dvojice), plus doplni kratsi seznam nulami
- zipPlus :: (Num a, Num b) => [a] -> [b] -> [(a,b)]
- zipPlus [] [] = []
- zipPlus [] (x:xs) = (0,x):(zipPlus [] xs)
- zipPlus (x:xs) [] = (x,0):(zipPlus xs [])
- zipPlus (x:xs) (y:ys) = (x,y):(zipPlus xs ys)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement