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

开启您的职业生涯

通过完成课程获得认证

开始学习
广告