Haskell程序:判断一个数是否为素数
为了检查给定的数字是否为素数,我们将使用Haskell中的模运算符和列表推导方法。
什么是素数?
素数是一个大于1的正整数,它只能被1和它本身整除。换句话说,素数不能写成两个较小正整数的乘积,除了1和它本身。例如,前几个素数是:2、3、5、7、11、13、17、19、23和29。
算法
步骤1 − 定义isPrime函数。
步骤2 − 程序执行将从main函数开始。main()函数控制整个程序。它写成main = do。在main函数中,一个数字被传递给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函数,或者使用列表推导来检查传递给函数的整数是否为素数。
广告