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 程式語言中編寫一個程式來檢查兩個整數之間的阿姆斯特朗數。