2012年 12月 23日
漢数字にするのはだいたいOKのようであるが、もうちょっと試してみよう。
*Main> putStrLn (konvert 1111111)
壱陌壱拾壱萬壱阡壱陌壱拾壱
1がいっぱいあったとき、不要な壱は使われないことが多い気がする。
上の場合、陌拾壱萬阡陌拾壱の方が普通ではないだろうか?
ということで、拾、陌、阡の場合(””でない)とくっつける場合には、数は漢字に直さず、桁の漢字だけにしてみた。
combinedig (n,s)
| n == 0 = ""
| n == 1 && s/="" = s
| otherwise = suuji!!n ++ s
*Main> putStrLn (konvert 1111111)
陌拾壱萬阡陌拾壱
これでかなり大きな数字まで漢数字にできる。
ところで、
*Main> putStrLn (konvert 0)
*Main>
となって、0は “”になってしまうのだ。
0も処理するために、konvertに、この次を追加しよう。
konvert 0 = "零"
すると、
*Main> putStrLn (konvert 0)
零
となって、大丈夫のようだ。
さらに、より大きい数(大数)を扱えるように、kuraiを変更した。
kurai = ["","萬","億","兆","京","垓","秭","穰","溝","澗","正",
"載","極","恒河沙","阿僧祇","那由他","不可思議","無量大数"]
無量大数は、10^68 のことである。(参照:ウィキペディア、命数法)
*Main> putStrLn (konvert (10^68))
壱無量大数
ということで、大きな数まで扱えるようになった。やれやれ。
*Main> 2^240
1766847064778384329583297500742918515827483896875618958121606201292619776
*Main> putStrLn (konvert (2^240))
七
阡六陌六拾八無量大数四阡七陌六不可思議四阡七陌七拾八那由他参阡八陌四拾参阿僧祇弐阡九陌五拾八恒河沙参阡弐陌九拾七極五阡七載四阡弐陌九拾壱正八阡五
陌拾五澗八阡弐陌七拾四溝八阡参陌八拾九穰六阡八陌七拾五秭六阡陌八拾九垓五阡八陌拾弐京阡六陌六兆弐阡拾弐億九阡弐陌六拾壱萬九阡七陌七拾六
ここまでのプログラム konvert3.hs