階乗でつまづくの巻
先日から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桁を越えたら上の桁は消すようにしました。
いくらかのテストケースは通るのですが、全部は通らず。ぐぬぬ...。
このブログを書きながら、上位桁を消すときに情報漏れが発生しているのかなぁと思いました。
いろいろ試してみて、通ったらまた更新してみます。。。