R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

C#3.0の新機能を使ってみる(その3)

http://blogs.wankuma.com/rti/archive/2007/11/21/109625.aspx
C#3.0の新機能を使ってみる(その2)

http://blogs.wankuma.com/rti/archive/2007/11/20/109453.aspx
C#3.0の新機能を使ってみる(その1)

http://blogs.wankuma.com/rti/archive/2007/11/19/109158.aspx
お疲れ様でした

・・・の続きです。


筆算をシミュレートするため、次の処理をサンプルとして考えてみます。

199
+11
----
210

処理の手順は、1 の位から順に各位ごとに足し算を繰り返します。
この時、その位に収まらない値は、次の位に引き継がれます。
上記のサンプルだと、1 の位は10となり 1 という値が、その位に収まらないので次の位に引き継がれなければなりません。

先日作成した拡張メソッドを利用して、この処理を作成してみます。


public static string CalcAdd(string value1, string value2) {
  // ループカウンタの最大値を取得
  var count = value1.Length > value2.Length ? value1.Length : value2.Length;

  var r? = String.Empty; // 計算結果を記録するための変数
  var n = 0m; // 次の位への連絡用変数
  for (var i = 0; i < count; ++i) {
    // 各位ごとに足し算を行う
    n = value1.GetOneDigit(i) + value2.GetOneDigit(i) + n;

    // 結果を 1 と 10 の位の値に分離。(10 → 1, 0)
    r =? (n % 10).ToString() + r; // 1 の位は、結果の文字列の右に付け加える
    n = Math.Floor(n / 10);  // 10 の位の値は、次の位で加算される
  }
  if (n > 0) r = n.ToString() + r;
  return r.TrimStart('0');
}


引き算も同様にコーディングしてみようと思います。


public static string CalcSub(string value1, string value2) {
  // ループカウンタの最大値を取得
  var count = value1.Length > value2.Length ? value1.Length : value2.Length;

  var r? = String.Empty; // 計算結果を記録するための変数
  var n = 0m; // 次の位への連絡用変数
  for (var i = 0; i < count; ++i) {
    // 各位ごとに引き算を行う
    var t = value1.GetOneDigit(i) - value2.GetOneDigit(i) - n;
    n = t < 0 ? t + 20: t;
// 結果がマイナスなら、20を加算する

    // 結果を 1 と 10 の位の値に分離。(10 → 1, 0)
    r =? (n % 10).ToString() + r; // 1 の位は、結果の文字列の右に付け加える
    n = Math.Floor(n / 10);  // 10 の位の値は、次の位で減算される
  }
  if (n > 0) r = n.ToString() + r;
  return r.TrimStart('0');
}


両者のコードは、大変良く似ています・・・w
#最近、良く似た展開を書いた気がw

各位ごとに単純な計算を繰り返して、その位だけで足りない場合は次の桁に何らかの値を引き継ぐという点で、足し算と引き算は、演算する部分を除いて同じです。

匿名メソッドかラムダ式

を使いたいよな・・・となりますよね?^^;

(つづく)

投稿日時 : 2007年11月27日 15:01

Feedback

# re: C#3.0の新機能を使ってみる(その3) 2007/11/27 15:50 渋木宏明(ひどり)

せっかくだから、長整数型のライブラリを作ってしまっては?

その場合、値は List<int> で表現した方がイロイロとお得なはずです。

# re: C#3.0の新機能を使ってみる(その3) 2007/11/28 13:21 R・田中一郎

そうなんですよね。

実は最初は、独自型として、List<byte>をラッピングしたものを使っていたんですが、オブ熱サンプル用に用いた場合に、ちょっとわかりにくいかな、と思ったので文字列型に変更した経緯があります。

実際に仕事で作るなら、筆算のシミュレート自体使わないと思います^^;

# C#3.0の新機能を使ってみる(その4) 2007/11/28 13:25 R.Tanaka.Ichiro's Blog

C#3.0の新機能を使ってみる(その4)

タイトル
名前
Url
コメント