hw1: init
This commit is contained in:
89
hw1/BigNum.hs
Normal file
89
hw1/BigNum.hs
Normal file
@@ -0,0 +1,89 @@
|
||||
{-
|
||||
Name: <Your name here>
|
||||
Class: CS 252
|
||||
Assigment: HW1
|
||||
Date: <Date assignment is due>
|
||||
Description: <Describe the program and what it does>
|
||||
-}
|
||||
|
||||
module BigNum (
|
||||
BigNum,
|
||||
bigAdd,
|
||||
bigSubtract,
|
||||
bigMultiply,
|
||||
bigEq,
|
||||
bigDec,
|
||||
bigPowerOf,
|
||||
prettyPrint,
|
||||
stringToBigNum,
|
||||
) where
|
||||
|
||||
type Block = Int -- An Int from 0-999
|
||||
|
||||
type BigNum = [Block]
|
||||
|
||||
maxblock = 1000
|
||||
|
||||
bigAdd :: BigNum -> BigNum -> BigNum
|
||||
bigAdd x y = bigAdd' x y 0
|
||||
|
||||
bigAdd' :: BigNum -> BigNum -> Block -> BigNum
|
||||
bigAdd' _ _ _ = error "Your code here"
|
||||
|
||||
bigSubtract :: BigNum -> BigNum -> BigNum
|
||||
bigSubtract x y =
|
||||
if length x < length y
|
||||
then error "Negative numbers not supported"
|
||||
else reverse $ stripLeadingZeroes $ reverse result
|
||||
where result = bigSubtract' x y 0
|
||||
|
||||
stripLeadingZeroes :: BigNum -> BigNum
|
||||
stripLeadingZeroes (0:[]) = [0]
|
||||
stripLeadingZeroes (0:xs) = stripLeadingZeroes xs
|
||||
stripLeadingZeroes xs = xs
|
||||
|
||||
-- Negative numbers are not supported, so you may throw an error in these cases
|
||||
bigSubtract' :: BigNum -> BigNum -> Block -> BigNum
|
||||
bigSubtract' _ _ _ = error "Your code here"
|
||||
|
||||
bigEq :: BigNum -> BigNum -> Bool
|
||||
bigEq _ _ = error "Your code here"
|
||||
|
||||
bigDec :: BigNum -> BigNum
|
||||
bigDec x = bigSubtract x [1]
|
||||
|
||||
-- Handle multiplication following the same approach you learned in grade
|
||||
-- school, except dealing with blocks of 3 digits rather than single digits.
|
||||
-- If you are having trouble finding a solution, write a helper method that
|
||||
-- multiplies a BigNum by an Int.
|
||||
bigMultiply :: BigNum -> BigNum -> BigNum
|
||||
bigMultiply _ _ = error "Your code here"
|
||||
|
||||
bigPowerOf :: BigNum -> BigNum -> BigNum
|
||||
bigPowerOf _ _ = error "Your code here"
|
||||
|
||||
prettyPrint :: BigNum -> String
|
||||
prettyPrint [] = ""
|
||||
prettyPrint xs = show first ++ prettyPrint' rest
|
||||
where (first:rest) = reverse xs
|
||||
|
||||
prettyPrint' :: BigNum -> String
|
||||
prettyPrint' [] = ""
|
||||
prettyPrint' (x:xs) = prettyPrintBlock x ++ prettyPrint' xs
|
||||
|
||||
prettyPrintBlock :: Int -> String
|
||||
prettyPrintBlock x | x < 10 = ",00" ++ show x
|
||||
| x < 100 = ",0" ++ show x
|
||||
| otherwise = "," ++ show x
|
||||
|
||||
stringToBigNum :: String -> BigNum
|
||||
stringToBigNum "0" = [0]
|
||||
stringToBigNum s = stringToBigNum' $ reverse s
|
||||
|
||||
stringToBigNum' :: String -> BigNum
|
||||
stringToBigNum' [] = []
|
||||
stringToBigNum' s | length s <= 3 = read (reverse s) : []
|
||||
stringToBigNum' (a:b:c:rest) = block : stringToBigNum' rest
|
||||
where block = read $ c:b:a:[]
|
||||
|
||||
sig = "9102llaf"
|
||||
Reference in New Issue
Block a user