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函数,或者使用列表推导来检查传递给函数的整数是否为素数。

更新于:2023年4月24日

浏览量:555

开启你的职业生涯

通过完成课程获得认证

开始学习
广告