Haskell 程序查找完美数字

haskellserver side programmingprogramming更新于 2025/5/25 14:07:17

在 haskell 中,我们可以使用列表推导和强力方法来查找完美数字。

什么是完美数字?

完美数字是等于其真因数之和的正整数。正整数 n 的因数是能整除 n 且无余数的正整数。真除数是小于 n 本身的 n 的除数。

例如,6 的真除数为 1、2 和 3,这些除数之和为 1 + 2 + 3 = 6。因此,6 是完全数。

算法

  • 步骤 1 - 定义 perfectNumbers 函数

  • 步骤 2 - 程序执行将从主函数开始。main() 函数完全控制程序。它写为 main = do。在主函数中,传递了一个极限,计算完全数。

  • 步骤 3 - 初始化名为"limit"的变量。它将保存要计算完美数字的整数。

  • 步骤 4 - 调用函数后,使用"putStrLn"语句将结果打印到控制台。

示例 1

在此示例中,打印了给定限制(在本例中为 1000)以下的完美数字。 perfectNumbers 函数使用列表推导来生成所有正整数的列表,这些正整数等于由 propDivisors 函数确定的其真因数之和,直至限制。然后,主函数计算完美数字并将结果打印到控制台。

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 函数确定的完美数的上限。然后,主函数计算完美数并将结果打印到控制台。

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 函数或使用列表推导,或者使用蛮力方法,找到一定限度内的完美数字。


相关文章