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

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告