プログラミング勉強日記

勉強したことを書きます。Haskellとか。

階乗でつまづくの巻

paiza.jp


先日からHaskellで挑戦してました。
一通りの問題を解いたのですが、彼女の水着を手に入れるための問題が全然通らなくて、あれれ?><状態です。


問題
「N!(Nの階乗)から、最下位桁から続く0を全て除いた値の下位9桁を出力せよ。」

条件
1 <= N <= 1000000
最下位桁から続く0を全て除いた値の下位9桁の最上位桁から0が続いている場合、その0は全て消去する。


詳しくはサイトから見て頂けると。。。


現状のコードはこちらです。

import Control.Applicative
import Data.List

fracB :: Integer -> Integer
fracB 0 = 1
fracB n = del0 (n * fracB (n-1)) `mod` 1000000000 + 1000000000
    where del0 x = if x `mod` 10 == 0 then del0 (x `div` 10) else x

main = do
    n <- (read::String->Integer) <$> getLine
    print $ cut9 $ fracB n
        where cut9 = read . reverse . take 9 . reverse . show :: Integer -> Integer

まともに計算すると桁がすごいことになったので、積ごとに下位桁に出てきた0を消すようにしました。(del0関数)
下位9桁の情報が分かればいいので、9桁を越えたら上の桁は消すようにしました。

いくらかのテストケースは通るのですが、全部は通らず。ぐぬぬ...。


このブログを書きながら、上位桁を消すときに情報漏れが発生しているのかなぁと思いました。
いろいろ試してみて、通ったらまた更新してみます。。。