• ベストアンサー

基数変換のアルゴリズムの問題

アルゴリズムの問題の回答に納得がいきません。 変換対象をDEC、基数をBASEに格納し、基数変換を行うというものです。 配列Bの添え字は「1」から始まり、DECをBASEで割った余りを 求める関数MODはあらかじめ用意されているものとする。 1.変数Iに1を格納、変数DECに変換対象を格納、変数BASEに基数を格納。 2.MOD(DEC,BASE)の結果を変数Nに格納。 3.NをB(I)に格納。 4.I + 1 をIに格納。 5.「 」の結果を変数DECに格納。 6.DEC=0なら処理終了、それ以外は(2) の処理へ戻る。 「  」内を埋める問題です。 私の答えは「(DEC - N) / BASE」だったのですが、正解は「DEC / BASE」でした。 DECからN(余り)を引いてからBASEで割らないと、 割り切れない場合、最悪いつまで経っても「DEC=0」にはならなくなってしまうと思うのですが、そうではないのでしょうか? 正解は「DEC / BASE」で、あっているのでしょうか? Perlでプログラムを書いて(配列Bの添え字は0からにして、whileの条件式を「DEC != 0」にしました)試してみましたが、 「DEC / BASE」だと、割り切れない場合、結果の0の数がえらいことになってしまいました(^^;) ちゃんと勉強し始めたのがつい最近なので説明がうまくできませんが、どなたか解るかた教えてくださいm(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.2

> 私の答えは「(DEC - N) / BASE」だったのですが、正解は「DEC / BASE」でした。 > DECからN(余り)を引いてからBASEで割らないと、 > 割り切れない場合、最悪いつまで経っても「DEC=0」にはならなくなってしまうと思うのですが、そうではないのでしょうか? そのアルゴリズムは何言語の話ですか? 例えばC言語なら、整数型の演算結果はすべて整数です。 割り算のようなものでは、1/10以下の位まで商を計算しません。 DEC = 40 ÷ 3 とすれば、40 ÷ 3 = 13余り1なので、DECには13の値が格納されます (DECが整数型変数なら)。 40 ÷ 3 = 13.333…ですが、整数型の変数は小数が格納できないので、整数値が格納されることになります。 また、 DEC = 2 ÷ 3 となれば、2 ÷ 3 = 0余り2なので、DECには0の値が代入されます。 なので、変数の型によってはDEC / BASEでも良いと思います。 余りを最初から引かなくても、対応できるんです。 他の言語でも、整数型変数を使っていればDEC / BASEで問題なく動作するはずです。

himazin38
質問者

お礼

回答ありがとうございます! 特に言語の指定はありませんでした。 なるほど。整数型の変数なら、余りを引かなくても良いのですね! 問題に整数のみという指定も特になかったので、 普通に割って小数まで計算していました(^^;) ありがとうございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

う~ん.... 「純粋に」アルゴリズムの問題だとすると, 何も仮定せず「DEC/BASE」としちゃダメです. 言い換えれば, どこかに「整数同士の除算は小数を切り捨てて整数とする」などと書いてあれば OK. アルゴリズムは本来 language-independent であるべきなんだけどなぁ....

himazin38
質問者

お礼

回答ありがとうございます! そうなんですよね。「整数同士の除算は小数を切り捨てて整数とする」等の記述があれば悩まなかったのに(^^; 特定の言語を習得する前に読むようなテキストなので、純粋なアルゴリズムの問題だと思います。 ありがとうございました!

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>私の答えは「(DEC - N) / BASE」だったのですが、正解は「DEC / BASE」でした。 コンピュータは 「/」 演算をする際、小数部を捨てるので、両者は同じ結果を得るでしょう(正数ならね)。 >Perlでプログラムを書いて(略) そのプログラムを補足にどうぞ。

himazin38
質問者

補足

回答ありがとうございます! 「/」演算では、小数部は捨てられてしまうのですね。 以下は私が書いたPerlのプログラムです。 use strict; use warnings; print "変換対象を入力。\n"; my $dec = <STDIN>; print "基数を入力。\n"; my $base = <STDIN>; my $i = 0; my $n = 0; my @b = (0); while ($dec != 0) { $n = $dec % $base; $b[$i] = $n; $i = $i + 1; $dec = $dec / $base; } print @b, "\n";

関連するQ&A