将十进制转换为八进制的 Haskell 程序

haskellserver side programmingprogramming

我们可以使用 Haskell 的递归和展开函数将十进制数转换为八进制数。

十进制到八进制的转换是将十进制(基数为 10)数转换为八进制(基数为 8)数字系统中的等效表示的过程。

在十进制数字系统中,我们使用 10 位数字(0 到 9)来表示一个数字。在八进制数字系统中,我们使用 8 位数字(0 到 7)来表示一个数字。要将十进制数转换为其等效的八进制表示,我们反复将十进制数除以 8,直到商变为 0,并跟踪余数。从下往上读出的余数给出了十进制数的八进制表示。

算法

  • 步骤 1 − 使用内部函数定义 decimalToOctal 函数

  • 步骤 2 − 程序执行将从 main 函数开始。main() 函数对程序有完全的控制权。它写为 main = do。在主函数中,使用参数 42 调用 decimalToOctal 函数,并将结果打印到控制台。

  • 步骤 3 - 调用函数后,使用"putStrLn"语句将结果八进制数打印到控制台。

示例 1

在此示例中,使用两个辅助函数 decimalToOctal 和 decimalToOctalHelper 执行转换。 decimalToOctal 函数使用尾部递归方法,其中结果建立在字符串 acc 中,该 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 作为输入,并以字符串形式返回其等效的八进制表示形式。主函数将 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 $ "等效的八进制表示形式为: " ++ decimalToOctal decimal

输出

等效的八进制表示形式为: 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 $ "等效的八进制表示形式为: " ++ decimalToOctal decimal

输出

等效的八进制表示形式为: 052

结论

在 Haskell 中,使用 unfoldr 函数或使用递归或尾递归将十进制数转换为八进制。


相关文章