2008-10-27
基数変換
Tips |
個人的に現在、どう書く?orgの過去ネタ消費週間となっておりまして(^ ^ やっと消化率が50%を超えました。
で、以下のような基数を変換する問題があったんですが、なでしこって基数変換が標準ではないんですね・・・
倍数になる13進数 http://ja.doukaku.org/14/
いや、16進だったら
HEX(15) INT($F)
とかやれば変換できますが、任意のn進数や小数の場合は対応していないので、自前で書いてみました。
まずはn進数→10進数の関数
●十進変換(radixのnを) もし、radix>36||radix<1ならば、空で戻る もし、n=空ならば、空で戻る n=nを大文字変換 baseとは配列="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"を文字列分解 dataとは配列=nの"."を""に置換を文字列分解 tmpとは配列=nを"."で区切る startとは整数=tmp[0]の文字数-1 endとは整数=tmp[1]の文字数*-1 ansとは実数 iとは整数 iでstartからendまで繰り返す ans=ans+(baseのdata[回数-1]を配列検索)*radix^i ansで戻る 36の"10"を十進変換して表示 8の"1427.654"を十進変換して表示
36進数まで。小数にも対応しています。データを増やせば何進数でも行けます。ひらがなも使ってめざせ100進数超え(ぇ
次は10進→n進数
●基数変換(nをradixに) もし、radix>36||radix<1ならば、空で戻る もし、n=空ならば、空で戻る xとは整数=nの整数部分 yとは実数=nの小数部分 もし、x=0&&y=0ならば、"0"で戻る baseとは配列="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"を文字列分解 ansとは文字列 tmpとは実数 x<>0の間 ans=base[(x%radix)]&ans x=INT(x/radix) もし、y=0ならば、ansで戻る もし、ans=""ならば、ans="0." 違えば、ans=ans&"." 16回 tmp=y*radix ans=ans&base[tmpの整数部分] y=tmpの小数部分 もし、y=0ならば、抜ける ansで戻る 35を36に基数変換して表示 0.2を16に基数変換して表示
こちらも小数に対応。小数部は循環することがあるので16回で切ってます(もっと増やすことも出来ます)
計算精度の問題か、小数部分がおかしくなることもありますが、気になる方は任意精度の計算機を使うといいかもしれませぬ。
#どっちの関数も宣言がやたら長い(^ ^;
Kaycee2011/11/24 01:28Phenomenal breakdown of the topic, you soluhd write for me too!
agckfydr2011/11/24 20:353DudAc <a href="http://waleoxtgusut.com/">waleoxtgusut</a>
bgsblvv2011/11/25 01:27Fje2c0 , [url=http://pmoldkrfakhp.com/]pmoldkrfakhp[/url], [link=http://novraujrlfxh.com/]novraujrlfxh[/link], http://bjiqmqwydfzj.com/
vcwrnjd2011/12/01 04:16qckj3G <a href="http://bflxpzcumjvb.com/">bflxpzcumjvb</a>
rkoiod2011/12/05 01:50qwLNB0 , [url=http://dmtchbbzmytl.com/]dmtchbbzmytl[/url], [link=http://ipenhcbyhskn.com/]ipenhcbyhskn[/link], http://uqmlrncmlvnu.com/