Haskell程式:將十六進位制轉換為十進位制
本教程將幫助我們建立一個Haskell程式,使用reverse、map和foldl函式將給定的十六進位制數轉換為十進位制數。
十六進位制到十進位制的轉換是將一個數從十六進位制數制轉換為十進位制數制的過程。
十六進位制數制使用16為基數,這意味著該系統中使用16個獨特的符號來表示數字(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F)。另一方面,十進位制數制使用10為基數,使用0到9的符號來表示數字。
演算法
步驟1 − 使用內部函式定義hexToDecimal函式。
步驟2 − 程式執行將從main函式開始。main()函式控制整個程式。它被寫成main = do。在main函式中,hexToDecimal函式被呼叫並帶引數,結果被列印到控制檯。
步驟3 − 命名為“hexStr”的變數被初始化。它將儲存要轉換為相應十進位制數的十六進位制數。
步驟4 − 函式呼叫後,使用‘putStrLn’語句將結果的十進位制數列印到控制檯。
示例1
在這個例子中,hexToDecimal函式首先使用map toUpper將十六進位制字串的每個字元轉換為大寫,然後使用map digitToInt將每個字元轉換為其等效的十進位制值,最後透過將十進位制值及其對應的乘數的乘積相加來計算十進位制表示。乘數使用iterate (*16) 1計算,它生成一個從1開始的16的冪的無限列表。zipWith (*)函式用於將每個十進位制值與其對應的乘數相乘。
import Data.Char (digitToInt, toUpper) hexToDecimal :: String -> Int hexToDecimal = sum . zipWith (*) (iterate (*16) 1) . reverse . map digitToInt . map toUpper main :: IO () main = do let hexStr = "34" putStrLn $ "The equivalent decimal representation is: " ++ show (hexToDecimal hexStr)
輸出
The equivalent decimal representation is: 52
示例2
在這種方法中,hexToDecimal函式首先使用map toUpper將十六進位制字串的每個字元轉換為大寫,然後使用hexDigitToInt輔助函式計算十進位制表示,該函式將每個十六進位制數字對映到其等效的十進位制值。然後使用foldl函式從左到右遍歷十進位制值的列表,對於每個值,它透過將當前值乘以16並加上當前十六進位制數字的十進位制等效值來計算更新的十進位制表示。
import Data.Char (digitToInt, toUpper,ord) hexToDecimal :: String -> Int hexToDecimal = foldl (\acc x -> acc * 16 + hexDigitToInt x) 0 . map toUpper where hexDigitToInt x | x >= '0' && x <= '9' = ord x - ord '0' | x >= 'A' && x <= 'F' = ord x - ord 'A' + 10 main :: IO () main = do let hexStr = "34" putStrLn $ "The equivalent decimal representation is: " ++ show (hexToDecimal hexStr)
輸出
The equivalent decimal representation is: 52
結論
在Haskell中,十六進位制數轉換為十進位制數是使用reverse、map和foldl函式實現的。從十六進位制轉換為十進位制時,每個十六進位制數字都乘以16的冪,這取決於它在數字中的位置。十六進位制數的十進位制表示是透過將每個數字的十進位制值相加得到的。