使用函数显示区间内阿姆斯特朗数的Haskell程序


Haskell拥有高阶函数和filter函数等,可用于获取两个给定区间之间的阿姆斯特朗数。在第一个示例中,我们将使用(isArmstrong和armstrongInRange函数与高阶函数),在第二个示例中,我们将使用(filter isArmstrong [a..b])函数。

算法

  • 步骤1 − 定义用户自定义的isArmstrong函数。

  • 步骤2 − 程序执行将从main函数开始。main()函数控制整个程序。它被编写为main = do。

  • 步骤3 − 初始化名为“lower”和“upper”的变量。它将保存要打印阿姆斯特朗数的范围。

  • 步骤4 − 函数调用后,使用‘print’函数将定义范围内的阿姆斯特朗数打印到控制台。

示例1

在这个例子中,我们将看到如何使用高阶函数显示两个区间之间的阿姆斯特朗数。

import Data.List (find)

isArmstrong :: Integer -> Bool
isArmstrong n = n == sum (map (^ len) digits)
   where
      digits = map (\x -> read [x] :: Integer) (show n)
      len = length digits

armstrongInRange'''' :: Integer -> Integer -> [Integer]
armstrongInRange'''' a b = filter (\x -> x == sum (map (^ (length (show x))) (map (\x -> read [x] :: Integer) (show x)))) [a..b]

main :: IO ()
main = do
let lower = 100
let upper = 1000
print (armstrongInRange'''' lower upper)

输出

[153,370,371,407]

示例2

在这个例子中,我们将看到如何使用filter函数显示两个区间之间的阿姆斯特朗数。

import Data.List (find)

isArmstrong :: Integer -> Bool
isArmstrong n = n == sum (map (^ len) digits)
   where
      digits = map (\x -> read [x] :: Integer) (show n)
      len = length digits

armstrongInRange' :: Integer -> Integer -> [Integer]
armstrongInRange' a b = filter isArmstrong [a..b]

main :: IO ()
main = do
let lower = 100
let upper = 1000
print (armstrongInRange' lower upper)

输出

[153,370,371,407]

结论

阿姆斯特朗数相对较少,只存在于较小的数字中。它们以Michael F. Armstrong的名字命名,他被认为是发现它们的人。

在Haskell中,要显示区间内的阿姆斯特朗数,我们可以使用高阶函数和filter函数。

更新于:2023年3月13日

122次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.