Haskell程式:十進位制轉換為八進位制


我們可以使用Haskell的遞迴和unfoldr函式將十進位制數轉換為八進位制數。

十進位制到八進位制的轉換是將十進位制(基數為10)數轉換為其在八進位制(基數為8)數制中的等效表示的過程。

在十進位制數制中,我們使用10個數字(0到9)來表示一個數。在八進位制數制中,我們使用8個數字(0到7)來表示一個數。為了將十進位制數轉換為其等效的八進位制表示,我們反覆將十進位制數除以8,直到商變為0,並記錄餘數。從下往上讀取的餘數就給出了十進位制數的八進位制表示。

演算法

  • 步驟1 − 使用內部函式定義decimalToOctal函式

  • 步驟2 − 程式執行將從main函式開始。main()函式控制整個程式的執行。它寫成main = do。在main函式中,decimalToOctal函式被呼叫,引數為42,結果被列印到控制檯。

  • 步驟3 − 函式呼叫後,使用‘putStrLn’語句將生成的八進位制數列印到控制檯。

示例1

在這個例子中,使用了兩個輔助函式decimalToOctal和decimalToOctalHelper來執行轉換。decimalToOctal函式使用尾遞迴方法,結果在一個字串acc中累積,該字串作為引數傳遞給decimalToOctalHelper函式。decimalToOctalHelper函式反覆將十進位制數除以8,直到它變為0,這些除法的餘數連線起來形成八進位制表示。

module Main where

decimalToOctal :: Int -> String
decimalToOctal 0 = "0"
decimalToOctal n = decimalToOctalHelper n []

decimalToOctalHelper :: Int -> String -> String
decimalToOctalHelper 0 acc = acc
decimalToOctalHelper n acc = decimalToOctalHelper (n `div` 8) (show (n `mod` 8) ++ acc)

main :: IO ()
main = putStrLn (decimalToOctal 42)

輸出

52

示例2

在這個例子中,定義了一個函式decimalToOctal,它接收一個整數x作為輸入,並將其等效的八進位制表示作為字串返回。main函式將decimal設定為42,然後將其傳遞給decimalToOctal函式以獲取八進位制表示。最後,使用putStrLn將結果列印到螢幕上。

import Data.List (unfoldr)

decimalToOctal :: Int -> String
decimalToOctal x = concat $ reverse $ unfoldr step x
   where step 0 = Nothing
         step y = Just (show (y `mod` 8), y `div` 8)

main :: IO ()
main = do
   let decimal = 42
   putStrLn $ "The equivalent octal representation is: " ++ decimalToOctal decimal

輸出

The equivalent octal representation is: 52

示例3

在這個例子中,使用遞迴將十進位制數轉換為其等效的八進位制表示。當x為0時為基例,在這種情況下,結果只是字串"0"。對於x的任何其他值,該函式首先呼叫自身並將x除以8以獲得商的八進位制表示,然後附加x除以8的餘數,這是八進位制表示當前最低有效位。

decimalToOctal :: Int -> String
decimalToOctal 0 = "0"
decimalToOctal x = decimalToOctal (x `div` 8) ++ show (x `mod` 8)


main :: IO ()
main = do
   let decimal = 42
   putStrLn $ "The equivalent octal representation is: " ++ decimalToOctal decimal

輸出

The equivalent octal representation is: 052

結論

在Haskell中,可以使用unfoldr函式或使用遞迴或尾遞迴將十進位制數轉換為八進位制數。

更新於: 2023年4月6日

瀏覽量:159

開啟您的職業生涯

透過完成課程獲得認證

開始學習
廣告