Haskell程序:检查两个整数之间的阿姆斯特朗数


本教程将讨论编写一个程序来显示两个整数之间的阿姆斯特朗数。Haskell 是一种函数式、声明式和强类型的语言。Haskell中的计算是数学函数。

阿姆斯特朗数是一个等于其各位数字的幂次方之和的数,幂次方等于该数的位数。

示例

9474 是阿姆斯特朗数,因为 9474 = 9^4 + 4^7 + 7^4 + 4^4。

153 是阿姆斯特朗数,因为 153 = 1^3 + 5^3 + 3^3。

算法步骤

  • 实现一个函数来检查一个数是否为阿姆斯特朗数。

  • 实现一个函数来生成两个整数之间的阿姆斯特朗数。

  • 显示生成的阿姆斯特朗数

  • 程序:显示两个整数之间的所有素数

  • 我们将程序分解成更简单的函数。

语法

Function to count the number of digits in an integer
-- function declaration
cntDigits :: Int->Int
-- function definition
cntDigits 0 = 0
cntDigits n = 1 + cntDigits (div n 10)

以上是一个实用函数,用于查找整数中的位数。我们声明该函数接受一个整数作为参数并返回一个整数。在函数定义中,我们定义了一个基本条件,如果参数为零则返回零。在所有其他情况下,函数返回 1 加上对自身进行递归调用(参数为数字除以 10)。即函数返回整数的位数。

Example: Output for cntDigits 123 is:
3

Function to sum the digits raised to the power of a number of digits
-- function declaration
sumDigits :: Int->Int->Int
-- function definition
sumDigits 0 _ = 0
sumDigits n digits= d^digits + sumDigits k digits
   where
   d = mod n 10
   k = div n 10

以上函数是一个实用函数,用于返回各位数字的幂次方之和,“幂次方”等于整数的位数。我们声明一个函数,它接受两个整数作为参数(数字和该数字中的位数),并返回一个整数。在函数定义中,我们提取整数中的数字,并将它们递归地提高到“整数中的位数”的幂次方,直到满足基例(第一个参数为零)。

注意 - “_” 表示通配符模式,用于匹配任何模式。

示例 - sumDigits 153 的输出为

153

函数:检查一个数是否为阿姆斯特朗数

-- function declaration
isArmstrong :: Int->Bool
-- function definition
isArmstrong n = n==(sumDigits n (cntDigits n))

以上函数是一个实用函数,用于检查一个数是否为阿姆斯特朗数。我们声明该函数接受一个待检查的整数作为输入并返回一个布尔值。在函数定义中,我们将参数数字与调用的实用函数 sumDigits 的输出进行比较,sumDigits 的参数是输入整数和该整数中的位数(通过实用函数 cntDigits 返回)。即此函数如果传入的整数参数是阿姆斯特朗数则返回 true,否则返回 false。

Example: Output for isArmstrong 153 is:
True

函数:显示两个整数之间的阿姆斯特朗数

-- function declaration
displayArmstrong :: Int->Int->[Int]
-- function definition
displayArmstrong a b = [x | x<-[a..b], isArmstrong x]

以上是一个实用函数,用于显示某个范围内的所有阿姆斯特朗数。我们声明该函数接受两个整数作为参数并返回一个整数列表。在函数定义中,我们使用列表推导式,生成两个参数之间的范围内的数字,并使用 isArmstrong 函数检查哪些数字是阿姆斯特朗数并返回这些数字。

例如,display 1 500 的输出为:

[1,2,3,4,5,6,7,8,9,153,370,371,407]

完整程序

示例

cntDigits :: Int->Int cntDigits 0 = 0 cntDigits n = 1 + cntDigits (div n 10) sumDigits :: Int->Int->Int sumDigits 0 _ = 0 sumDigits n digits= d^digits + sumDigits k digits where d = mod n 10 k = div n 10 isArmstrong :: Int->Bool isArmstrong n = n==(sumDigits n (cntDigits n)) displayArmstrong :: Int->Int->[Int] displayArmstrong a b = [x | x<-[a..b], isArmstrong x] main :: IO() main = do -- declaring initializing the number to be let a = 1 let b = 1000 print (displayArmstrong a b)

输出

[1,2,3,4,5,6,7,8,9,153,370,371,407,1634,8208,9474]

以上是显示两个整数之间所有阿姆斯特朗数的完整程序。在以上程序的主函数中,我们声明并初始化了两个变量 a 和 b。我们使用参数 a 和 b 调用函数 displayArmstrong,它返回这两个整数之间的所有阿姆斯特朗数。最后,我们打印返回的阿姆斯特朗数列表。

结论

在本教程中,我们讨论了在 Haskell 编程语言中编写一个程序来检查两个整数之间的阿姆斯特朗数。

更新于:2022年10月27日

浏览量:287

启动你的职业生涯

完成课程获得认证

开始学习
广告