使用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。
