gpt4 book ai didi

haskell - 欧拉计划 8 - Haskell

转载 作者:行者123 更新时间:2023-12-02 06:59:05 25 4
gpt4 key购买 nike

通过 Project Euler,我正在将我的解决方案与 here 的解决方案进行比较。

对于问题 8,我的代码产生了正确的答案(通过网站上的校验和确认)23514624000。

module Main where

import Data.List

main = do
print $ last (sort eulerEight)


eulerEight = doCalc [ x | x <- toDigits 7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450]
where
doCalc (_:[]) = []
doCalc (x:xs) = if 0 `notElem` take 13 (x:xs) && length (x:xs) > 12
then product (take 13 (x:xs)) : doCalc xs
else doCalc xs

toDigits n
| n < 1 = []
| otherwise = toDigits (n `div` 10) ++ [n `mod` 10]

我意识到这样检查解决方案 here 可能会好很多,但它似乎不正确。

import Data.Char (digitToInt)
import Data.List

problem_8 = do
str <- readFile "number.txt"
-- This line just converts our str(ing) to a list of 1000 Ints
let number = map digitToInt (concat $ lines str)
print $ maximum $ map (product . take 13) (tails number)

我已根据 Project Euler 网站上的问题将 take 5 的值更改为 take 13,但是上面的代码产生了 2091059712 的错误答案。我检查了 number.txt 中的数字是否正确,并且它具有两个示例的完整 1000 位数字。任何人都可以阐明为什么输出不同吗? (我想可能与它使用 tails 而不是 tail 的事实有关,但我不确定)

最佳答案

发生的情况是 digitToInt 返回一个 Int,在 32 位系统上太短,无法在 5 增加到 13 时保存测试数字。更改它到 (fromIntegral . digitToInt) 并且它工作正常。

关于haskell - 欧拉计划 8 - Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25344196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com