简体   繁体   中英

Project Euler #24 in Haskell

I am trying to solve the problems from Project Euler using Haskell, but I got sucked at #24

I'm trying to use factorials to solve problem but just can't work for the last three digits, here is my code:

import Data.List
fact n = product [n, n-1 .. 1]
recur :: Int -> Int -> [Int] -> [Int]
recur x y arr
    | y > 1     = arr !! d : recur r (y-1) (delete (arr !! d) arr)
    | otherwise = arr
    where d = x `div` fact y
          r = x `mod` fact y

main::IO()
main = print(recur 1000000 9 [0..9])

(I know it is now not really "functional") I managed to get result [2,7,8,3,9,1,4,5,0,6] , while the right answer I accidently figured out by hand is 2783915460 .

I just want to know why this algorithm doesn't work for the last three digits. Thanks.

Unadulterated divMod is wrong for this algorithm. You need

dvm x facty | r == 0    = (d-1, facty)
            | otherwise = (d, r)
                  where
                  (d, r) = divMod x facty

instead:

recur x y arr
.......
.......
    where (d, r) = x `dvm` fact y

We cannot have zero combinations to do left. Zero means none.

Also the pattern guard condition should be changed to y > 0 . Only when the length of the remaining choices list is 1 (at which point y is 0) there's no more choices to be made and we just use the last available digit left.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM