aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMyoungjin JEON <jeongoon@gmail.com>2020-08-08 13:53:17 +1000
committerMyoungjin JEON <jeongoon@gmail.com>2020-08-08 13:53:17 +1000
commit4957f1164ef7ad7670289dc63013ea80adc4f974 (patch)
tree7963c47bd9788dc61bb244de808fb4406a6efbda
parentc0c7f8ec8494b7a64edad9f8b8e959b73c6766fa (diff)
downloadperlweeklychallenge-club-4957f1164ef7ad7670289dc63013ea80adc4f974.tar.gz
perlweeklychallenge-club-4957f1164ef7ad7670289dc63013ea80adc4f974.tar.bz2
perlweeklychallenge-club-4957f1164ef7ad7670289dc63013ea80adc4f974.zip
[ch-071/jeongoon] add brute force method of haskell for task 1
-rw-r--r--challenge-072/jeongoon/haskell/ch-1.hs31
1 files changed, 20 insertions, 11 deletions
diff --git a/challenge-072/jeongoon/haskell/ch-1.hs b/challenge-072/jeongoon/haskell/ch-1.hs
index 0775791436..7780f3ba55 100644
--- a/challenge-072/jeongoon/haskell/ch-1.hs
+++ b/challenge-072/jeongoon/haskell/ch-1.hs
@@ -15,30 +15,37 @@ https://stackoverflow.com/questions/940382/what-is-the-difference-between-dot-an
... and many more..
--}
-factorial :: Integer -> Integer
-factorial x = product [ 1.. x ]
+factorial :: Int -> Integer
+factorial x = product [ 1.. fromIntegral x ]
-nthRootOfFive :: Integer -> Integer
+nthRootOfFive :: Integer -> Int
nthRootOfFive x
| x `mod` 5 /= 0 = 0
| otherwise = 1 + nthRootOfFive ( x `div` 5 )
-
-getN :: [String] -> Integer
+getN :: [String] -> Int
getN [] = 0
-getN (x:xs) = if all isNumber x then read x :: Integer else getN xs
+getN (x:xs) = if all isNumber x then read x :: Int else getN xs
-printGenTrim :: [String] -> Integer -> Integer -> IO ()
+printGenTrim :: [String] -> Int -> Int-> IO ()
printGenTrim x n a
| ( "--show-divided" `elem` x ) = do
putStrLn $ "N! = " ++ fnstr
putStrLn $ "N! = " ++ take h fnstr ++ " | " ++ drop h fnstr
| otherwise = return ()
where
- fnstr = show $ factorial $ n
+ fnstr = show $ factorial n
a' = fromIntegral a
h = length fnstr - a'
+calculateTrailingZero :: Int -> Int
+calculateTrailingZero n = sum [ nthRootOfFive $ fromIntegral x | x <- [1 .. n] ]
+
+bruteforceTrailingZero :: Int -> Int
+bruteforceTrailingZero n =
+ length $ takeWhile (\x -> nFact `mod` x == 0) (map (10^) [(1::Integer)..])
+ where nFact = factorial $ fromIntegral n
+
main :: IO ()
main = do
args <- getArgs -- IO [String]
@@ -56,7 +63,9 @@ main = do
else
die "Could not find N (Not given or Invalid)"
- putStrLn $ "Given Number: " ++ show n
- let answer = sum [ nthRootOfFive x | x <- [ 1 .. n ] ]
+ putStrLn $ "Given Number: " ++ show n
+ let answer = calculateTrailingZero n
+ let answer' = bruteforceTrailingZero n
printGenTrim args n answer
- putStrLn $ "Answer: " ++ show answer
+ putStrLn $ "Calcuated: " ++ show answer
+ putStrLn $ "BruteForced: " ++ show answer'