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 函数或列表推导,或者使用暴力法来查找一定限制内的完美数。

更新于: 2023年4月24日

332 次查看

开启你的职业生涯

通过完成课程获得认证

立即开始
广告