CodeIQ 挑戦の記録 : 【100名限定】変進小数の足し算【手動採点】

CodeIQというサイトで問題に挑戦した記録です。

codeiq.jp

問題文を要約すると下記の通り

  • <小数第n位が11-n進数> というルールの計算を「変進小数」と呼ぶ事にする。
    (例えば、小数第1位は10進数、小数第9位は2進数)
  • 変進小数での足し算を考える。
    入力の例 8.622+3.177
    出力の例 11.811
  • テキストファイルが与えられ、以下の数値がTAB区切りで複数行含まれている。
    {データID, 変進小数の足し算, 変進小数で表された足し算の結果}
    ほとんどのデータは正しい結果になっているが、正しくないデータが幾つか含まれている。
    正しくないデータのデータIDをコンマ区切りで解答する。

方針

題意の通り変進小数の和の演算を実装し、与えられたデータと比較する。
計算方法は以下の通り。
整数部と小数部を分けて計算する。
小数部は再帰にて実装する。
小数点以下1桁めから、再帰関数で1桁ずつ降りていき、2数の内短い方に達したら長い方の数値のそれ以下は計算する必要がないのでそのまま外部変数(配列)に代入する。
短い方の最下位桁から順に11-n進数として計算、繰り上がりを返り値で返し、加算する。
加算した数値は順に配列に代入する。
整数部まで繰り上がりを計算し、整数部と合わせて足し算の答えとする。
この答えと与えられたデータとの比較をする。
小数点以下で最終桁が0とか、小数点の表示されていない答えとの照合の為、 正誤の判定は2つを浮動小数点に変換して比較する。

注意点

下記の様なコーナーケース(注意しないと間違い易いデータ)を想定した。

  • 浮動小数点数計算を行うと誤差を生じ、計算結果が異なる可能性がある。
  • 文字列として比較すると小数点以下で最終桁が0で終わると表示が同じにならない。
  • 同様に結果が整数になった場合、小数点、小数点以下が表示されず同じ表示にならない。

この対策の為、変進小数の計算は配列に代入した各桁ごとに計算し、比較については一旦文字列にしたものを浮動小数点数に変換して比較した。
この点につき、解答にコメントとして記入して提出すると、下記の様なフィードバックを頂いたので一部要旨を紹介する。
(フィードバックありがとうございました。)

  • 浮動小数点数での計算に誤差の恐れがあるのであれば、Rubyで書いているのだから有理数を用いてはどうか?
    特に、最後で浮動小数点数として2数を比較している部分について。

RubyにはRationalクラスという分数をそのまま扱えるクラスがあるので、誤差を生む心配なく計算ができる。
しかしながら、Rationalクラスの存在は知っているが、使った事がなかったので、その発想もなかった。

実装(Ruby)

では、


Sponsored Link