将十进制转换为八进制的 Haskell 程序
我们可以使用 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 函数或使用递归或尾递归将十进制数转换为八进制。