« Project Euler : Problem 19 | トップページ | Project Euler : Problem 21 〜 友愛数 »

2010年4月24日 (土)

Project Euler : Problem 20 ~ 整数 ⇌ リスト

 問題はこちらをご覧ください。

 

 この問題は、実際に "100!" を求めて、その答えを各桁にばらしてリストに収めた後に、その合計を求めるという方針で解くことにしました。
 そこで、整数をリストに変形する関数とリストを整数に変形する関数を考えました。

 

import Data.Char -- 整数をリストに変換 (十進法限定) -- ex : dexToList 123 => [1,2,3] dexToList :: Integral a => a -> [Int] dexToList = (map digitToInt) . show -- リストを整数に変換 (十進法限定) -- ex : listToDex [1,2,3] => 123 listToDex :: Integral a => [Int] -> a listToDex = fromIntegral . read . (map intToDigit)
 こちらは「十進法限定」ですが、非常にシンプルな関数になりました。

 

-- 整数をリストに変換 -- ex : intToList 10 123 => [1,2,3] -- ex : intToList 2 123 => [1,1,1,1,0,1,1] intToList :: Integral a => a -> a -> [Int] intToList radix n = map fromIntegral $ iter n [] where iter n prd | n < radix = n : prd | otherwise = iter q (r : prd) where (q, r) = quotRem n radix -- リストを整数に変換 -- ex : listToInt 10 [1,2,3] => 123 -- ex : listToInt 2 [1,1,1,1,0,1,1] => 123 listToInt :: Integral a => Int -> [Int] -> a listToInt radix ns = fromIntegral $ foldl calc 0 ns where calc x y = x * radix + y
 こちらは基数を指定して変換することができます。

 

 では実際のコードですが、今回はシンプルな関数の方を使うことにしました。

import Data.Char(digitToInt) dexToList :: Integral a => a -> [Int] dexToList = (map digitToInt) . show problem20 :: Int problem20 = sum $ dexToList $ product [2 .. 100] -- problem20 = (sum . dexToList . product) [2 .. 100] main = print problem20

« Project Euler : Problem 19 | トップページ | Project Euler : Problem 21 〜 友愛数 »

Haskell」カテゴリの記事

Project Euler」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/48167832

この記事へのトラックバック一覧です: Project Euler : Problem 20 ~ 整数 ⇌ リスト:

« Project Euler : Problem 19 | トップページ | Project Euler : Problem 21 〜 友愛数 »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ