首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

优化Haskell代码,计算低于200万的所有素数之和

优化Haskell代码,计算低于200万的所有素数之和可以通过以下步骤实现:

  1. 使用筛选法生成素数列表:筛选法是一种常用的生成素数的方法。我们可以使用埃拉托斯特尼筛法(Sieve of Eratosthenes)来生成低于200万的素数列表。该算法的基本思想是从2开始,将每个素数的倍数标记为非素数,直到遍历完所有小于200万的数。
  2. 优化算法:在实现筛选法时,可以采取一些优化措施来提高性能。例如,可以只遍历小于等于sqrt(200万)的数,因为大于sqrt(200万)的数的倍数已经在之前的遍历中被标记为非素数。此外,可以使用数组或位图来表示数字是否为素数,以提高访问速度。
  3. 计算素数之和:遍历生成的素数列表,将每个素数累加到一个变量中,得到低于200万的所有素数之和。

以下是一个示例的Haskell代码实现:

代码语言:haskell
复制
import Data.Array.ST
import Data.Array.Unboxed
import Control.Monad.ST

-- 生成低于n的素数列表
sieve :: Int -> UArray Int Bool
sieve n = runSTUArray $ do
  -- 使用位图表示数字是否为素数
  isPrime <- newArray (2, n) True
  let limit = floor (sqrt (fromIntegral n))
  -- 从2开始遍历,将每个素数的倍数标记为非素数
  forM_ [2..limit] $ \i -> do
    prime <- readArray isPrime i
    when prime $ do
      forM_ [i*i, i*i+i..n] $ \j -> do
        writeArray isPrime j False
  return isPrime

-- 计算低于n的所有素数之和
sumOfPrimes :: Int -> Int
sumOfPrimes n = sum $ filter (isPrime !) [2..n]
  where isPrime = sieve n

main :: IO ()
main = do
  let n = 2000000
  putStrLn $ "Sum of primes below " ++ show n ++ ": " ++ show (sumOfPrimes n)

这段代码使用了位图来表示数字是否为素数,以提高访问速度。它首先生成低于200万的素数列表,然后计算素数之和并输出结果。

推荐的腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的合辑

领券