欢迎访问宙启技术站
智能推送

使用Haskell编写一个程序来计算给定整数的素数因子

发布时间:2023-12-09 20:34:34

下面是一个使用Haskell编写的程序,用于计算给定整数的素数因子:

import Data.List (nub)

-- 判断一个数是否为素数
isPrime :: Integer -> Bool
isPrime n
  | n < 2 = False
  | otherwise = null [x | x <- [2..sqrtN], n mod x == 0]
  where sqrtN = floor . sqrt . fromIntegral $ n

-- 计算给定整数的素数因子
primeFactors :: Integer -> [Integer]
primeFactors n
  | n < 2 = []
  | otherwise = factorize n 2
  where factorize :: Integer -> Integer -> [Integer]
        factorize 1 _ = []
        factorize k p
          | k mod p == 0 = p : factorize (k div p) p
          | otherwise = factorize k (nextPrime p)
        nextPrime p
          | isPrime (p + 1) = p + 1
          | otherwise = nextPrime (p + 1)

main :: IO ()
main = do
  putStrLn "请输入一个整数:"
  input <- getLine
  let n = read input :: Integer
      factors = primeFactors n
  putStrLn "该数的素数因子为:"
  putStrLn $ show factors

该程序包含了以下函数:

- isPrime 函数用于判断一个数是否为素数。它首先判断该数是否小于2,若是则返回 False。否则,它会检查从2到sqrt(n)之间的每个数是否能整除该数。若能整除,则该数不为素数。否则,该数为素数。

- primeFactors 函数用于计算给定整数的素数因子。首先,它检查该数是否小于2,若是则返回一个空列表。否则,它会调用辅助函数 factorize 进行因式分解。factorize 函数接受两个参数,一个是当前需要分解的数 k,另一个是当前的素数因子 p。它首先检查如果 k 能被 p 整除,则将 p 添加到结果列表,并继续对 k 进行除以 p 的因式分解。否则,它通过调用 nextPrime 函数找到下一个素数 q,再递归调用 factorize 进行分解。

- nextPrime 函数用于找到给定数的下一个素数。它首先检查 p+1 是否是素数,若是则返回该数;否则,递归调用 nextPrime (p+1) 查找下一个素数。

- main 函数用于与用户交互,接收一个整数作为输入,计算其素数因子并输出。

下面是一个使用例子:

请输入一个整数:
84
该数的素数因子为:
[2,2,3,7]

在上面的例子中,用户输入了整数 84,且使用该程序计算出了其素数因子,即 [2,2,3,7]。这表示 84 可以分解为 2 * 2 * 3 * 7