欧拉8号计划-Haskell [英] Project Euler 8 - Haskell
问题描述
通过Euler项目,我正在将自己的解决方案与此处进行比较.. >
对于问题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]
我意识到这样检查解决方案可能会好得多此处似乎不正确.
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网站上的问题,我已将5的值更改为13,但是上面的代码产生了2091059712的错误答案.我检查了number.txt中的数字是否正确,并且这两个示例都具有完整的1000位数字.谁能阐明为什么输出不同? (我想也许与它使用tails
而不是tail
的事实有关,但我不确定)
正在发生的情况是digitToInt
返回一个Int
,在32位系统上,该数字太短,无法将测试数增加5来保存测试号. 13.将其更改为(fromIntegral . digitToInt)
,它可以正常工作.
Going through Project Euler I am comparing my solutions to the ones here.
For question 8 my code produces the correct answer (confirmed via the check sum on the website) 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]
I realised this could be a lot better to so checked the solution here and it doesn't seem to be correct.
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)
I've changed the value of take 5 to take 13 as per the question on the Project Euler site, however the code above produces an incorrect answer of 2091059712. I've checked the number in number.txt is correct and that it has the full 1000 digits for both examples. Can anybody shed light on why the outputs are different? ( im thinking maybe to do with the fact it uses tails
and not tail
, but im not sure)
What is happening is that digitToInt
returns an Int
, which on 32-bit systems is too short to hold the test numbers when 5 is increased to 13. Change it to (fromIntegral . digitToInt)
and it works correctly.
这篇关于欧拉8号计划-Haskell的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!