Haskell 程序检查数字是否为素数
要检查给定数字是否为素数,我们将在 Haskell 中使用 mod 函数和列表推导方法。
什么是素数?
素数是大于 1 的正整数,只能被 1 和其本身整除。换句话说,素数不能写成两个较小正整数的乘积,除了 1 和其本身。例如,前几个素数是:2、3、5、7、11、13、17、19、23 和 29。
算法
步骤 1 - 定义 isPrime 函数。
步骤 2 - 程序将从 main 函数开始执行。 main() 函数对程序有完全的控制权。它写为 main = do。在主函数中,一个数字被传递给 isPrime 函数。该函数的结果用于打印一条消息,指示该数字是否为素数。
步骤 3 - 初始化名为"n"的变量。它将保存要检查是否为素数的整数。
步骤 4 - 调用函数后,使用"putStrLn"语句将结果打印到控制台。
示例 1
在此示例中,isPrime 函数将整数 n 作为输入并返回一个布尔值,指示该数字是否为素数。该函数使用 all 函数检查从 2 到 n 平方根的底数的所有数字是否不是 n 的除数。如果所有这些数字都不是除数,那么 n 就是质数。
isPrime :: Integer -> Bool isPrime n = n > 1 && all (\x -> n `mod` x /= 0) [2 .. floor (sqrt (fromIntegral n))] main :: IO () main = do let n = 7 if n > 0 then if isPrime n then putStrLn "The number is prime." else putStrLn "The number is not prime." else putStrLn "Invalid input. Please enter a positive integer."
输出
The number is prime.
示例 2
在此示例中,使用 mod 和 filter 函数定义一个函数 isPrime,用于检查传递的整数是否为素数。
isPrime :: Int -> Bool isPrime n = n > 1 && (filter (\x -> n `mod` x == 0) [2..n-1] == []) main :: IO () main = do let n = 7 if n > 0 then if isPrime n then putStrLn "The number is prime." else putStrLn "The number is not prime." else putStrLn "Invalid input. Please enter a positive integer."
输出
The number is prime.
示例 3
在此示例中,对于所有其他情况,我们使用列表推导来检查 [3, 5, ..., upperBound] 范围内是否有任何数字可以整除 n。如果不存在这样的数字,则 n 为素数,我们返回 True。
isPrime :: Int -> Bool isPrime n | n <= 1 = False | n == 2 = True | even n = False | otherwise = all (\x -> n `mod` x /= 0) [3,5..upperBound] where upperBound = floor $ sqrt $ fromIntegral n main :: IO () main = do let n = 7 if n > 0 then if isPrime n then putStrLn "The number is prime." else putStrLn "The number is not prime." else putStrLn "Invalid input. Please enter a positive integer."
输出
The number is prime.
结论
在 Haskell 中,我们可以使用 mod 函数以及 fromIntegral 或 filter 函数,或者使用列表推导来检查传递给函数的整数是否为素数。