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 编程语言中编写一个程序来检查两个整数之间的阿姆斯特朗数。