Hatena::Groupnadesiko

99円のへたれ学習帳

2008-10-27

基数変換

| 23:16

個人的に現在、どう書く?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で切ってます(もっと増やすことも出来ます)

計算精度の問題か、小数部分がおかしくなることもありますが、気になる方は任意精度の計算機を使うといいかもしれませぬ。

#どっちの関数も宣言がやたら長い(^ ^;

KayceeKaycee 2011/11/24 01:28 Phenomenal breakdown of the topic, you soluhd write for me too!

agckfydragckfydr 2011/11/24 20:35 3DudAc <a href="http://waleoxtgusut.com/">waleoxtgusut</a>

bgsblvvbgsblvv 2011/11/25 01:27 Fje2c0 , [url=http://pmoldkrfakhp.com/]pmoldkrfakhp[/url], [link=http://novraujrlfxh.com/]novraujrlfxh[/link], http://bjiqmqwydfzj.com/

vcwrnjdvcwrnjd 2011/12/01 04:16 qckj3G <a href="http://bflxpzcumjvb.com/">bflxpzcumjvb</a>

rkoiodrkoiod 2011/12/05 01:50 qwLNB0 , [url=http://dmtchbbzmytl.com/]dmtchbbzmytl[/url], [link=http://ipenhcbyhskn.com/]ipenhcbyhskn[/link], http://uqmlrncmlvnu.com/

ゲスト



トラックバック - http://nadesiko.g.hatena.ne.jp/kyuuzyuu9yen/20081027