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
各位ごとに単純な計算を繰り返して、その位だけで足りない場合は次の桁に何らかの値を引き継ぐという点で、足し算と引き算は、演算する部分を除いて同じです。
匿名メソッドかラムダ式
を使いたいよな・・・となりますよね?^^;
(つづく)