Haskell 检查阿姆斯特朗数
在Haskell中,我们可以使用列表推导和sum函数来检查给定的数是否为阿姆斯特朗数。阿姆斯特朗数,也称为自恋数,是指其各个位的立方和等于该数本身的数。
例如,数字153是一个阿姆斯特朗数,因为1^3 + 5^3 + 3^3 = 153。
步骤
- 步骤1 − “armstrong”函数使用列表推导和sum函数计算数字n的各个位的立方和,并定义如下:
-
步骤2 − 程序执行将从”main”函数开始。”main()”函数对程序具有整体控制。它被写作main = do。”main”函数从用户接受输入,并将其传递给”armstrong”函数来检查它是否为阿姆斯特朗数。如果是,则显示消息”It is an Armstrong number.”,否则显示”It is not an Armstrong number.”。
-
步骤3 − 初始化一个名为”num”的变量。它将保存要检查的数是否为阿姆斯特朗数。
-
步骤4 − 在调用函数之后,使用’putStrLn’语句将结果打印到控制台。
示例1
在这个示例中,”armstrong”函数以一个整数n作为输入,如果它是一个阿姆斯特朗数,则返回True,否则返回False。
“armstrong”函数使用列表推导和sum函数计算数字n的各个位的立方和。
armstrong :: Int -> Bool
armstrong n = sum [x^length (show n) | x <- (map (\x -> read [x]) (show n))] == n
main :: IO ()
main = do
let num = 153
if armstrong num
then putStrLn "It is an Armstrong number."
else putStrLn "It is not an Armstrong number."
输出
It is an Armstrong number.
示例2
在这个示例中,定义了一个函数armstrong,使用sum和digitToInt函数来检查传递的数字是否是阿姆斯特朗数字。
import Data.Char
armstrong :: Int -> Bool
armstrong n = n == sum [digitToInt x ^ length (show n) | x <- show n]
main :: IO ()
main = do
let num = 153
if armstrong num
then putStrLn "It is an Armstrong number."
else putStrLn "It is not an Armstrong number."
输出
It is an Armstrong number.
示例3
在这个示例中,armstrong函数接受一个整数n作为输入,如果它是一个阿姆斯特朗数,则返回True,否则返回False。
armstrong函数使用列表推导和sum函数计算n的各个数字的立方和。
armstrong :: Int -> Bool
armstrong n = n == sum [x^d | x <- digits n, let d = numberOfDigits n]
where
digits n = map (\x -> read [x]) (show n)
numberOfDigits n = length (show n)
main :: IO ()
main = do
let num = 153
if armstrong num
then putStrLn "It is an Armstrong number."
else putStrLn "It is not an Armstrong number."
输出
It is an Armstrong number.
结论
在Haskell中,我们可以通过使用函数如show,map,read,length和sum来编写一个程序来检查给定的数字是否是阿姆斯特朗数。基本思想是将数字转换为字符串,然后将字符串中的每个字符转换回整数,最后计算数字的各个位上数字的立方和。如果和原始数字相等,则是阿姆斯特朗数,否则不是。