Haskell程序查找完美数
在 Haskell 中,我们可以使用列表推导和暴力法来查找完美数。
什么是完美数?
完美数是等于其所有真因数之和的正整数。正整数 n 的因数是能整除 n 的正整数,没有余数。真因数是 n 的因数,且小于 n 本身。
例如,6 的真因数是 1、2 和 3,这些因数之和是 1 + 2 + 3 = 6。因此,6 是一个完美数。
算法
步骤 1 − 定义 perfectNumbers 函数
步骤 2 − 程序执行将从 main 函数开始。main() 函数控制整个程序。它被写成 main = do。在 main 函数中,传递了一个限制,在此限制下计算完美数。
步骤 3 − 初始化名为“limit”的变量。它将保存要计算完美数的整数上限。
步骤 4 − 函数调用后,使用 ‘putStrLn’ 语句将结果打印到控制台。
示例 1
在此示例中,打印了给定限制(在本例中为 1000)内的完美数。perfectNumbers 函数使用列表推导生成一个列表,其中包含所有小于等于限制的正整数,这些整数等于其真因数之和,由 properDivisors 函数确定。然后,main 函数计算完美数并将结果打印到控制台。
perfectNumbers :: Int -> [Int] perfectNumbers limit = [x | x <- [2..limit], x == sum (properDivisors x)] properDivisors :: Int -> [Int] properDivisors n = [x | x <- [1..n-1], n `mod` x == 0] main :: IO () main = do let limit = 1000 let perfects = perfectNumbers limit putStrLn $ "The perfect numbers up to " ++ show limit ++ " are: " ++ show perfects
输出
The perfect numbers up to 1000 are: [6,28,496]
示例 2
在此示例中,使用埃拉托色尼筛法定义了 perfectNumbers 和 properDivisors 函数来计算完美数。
import Data.Array properDivisors :: Int -> [Int] properDivisors n = [x | x <- [1..n `div` 2], n `mod` x == 0] perfectNumbers :: Int -> [Int] perfectNumbers limit = [x | x <- [2..limit], x == sum (properDivisors x)] main :: IO () main = do let limit = 1000 let perfects = perfectNumbers limit putStrLn $ "The perfect numbers up to " ++ show limit ++ " are: " ++ show perfects
输出
The perfect numbers up to 1000 are: [6,28,496]
示例 3
在此示例中,isPerfect 函数以整数 n 作为输入,如果 n 是完美数则返回 True,否则返回 False。perfectNumbers 函数使用列表推导生成一个列表,其中包含所有小于等于限制的正整数,这些整数是完美数,由 isPerfect 函数确定。然后,main 函数计算完美数并将结果打印到控制台。
isPerfect :: Int -> Bool isPerfect n = n == sum [x | x <- [1..n-1], n `mod` x == 0] perfectNumbers :: Int -> [Int] perfectNumbers limit = [x | x <- [2..limit], isPerfect x] main :: IO () main = do let limit = 1000 let perfects = perfectNumbers limit putStrLn $ "The perfect numbers up to " ++ show limit ++ " are: " ++ show perfects
输出
The perfect numbers up to 1000 are: [6,28,496]
结论
在 Haskell 中,我们可以使用一些用户定义的函数以及 mod 函数或列表推导,或者使用暴力法来查找一定限制内的完美数。