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

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.