さてさて、いよいよ大本命(?)の足し算の実装に取り掛かってみます。
→ソースコード
public Fraction add(Fraction dst){ if(this.isInfinity() || dst.isInfinity())return INFINITY; if(this.isZero())return dst; if(dst.isZero())return this; long lcm = MathUtil.lcm(this.denominator, dst.denominator); Fraction result = new Fraction( this.numerator * lcm / this.denominator + dst.numerator * lcm / dst.denominator, lcm ); return result.reduce(); }
まずどちらかの分数が無限大かどうかを調べ、無限大であれば無限大を返します。無限大に何を足しても無限大ですから。
次に自分自身が0の場合には相手を、相手が0の場合には自分自身を返します。0は何に足しても変化が無いので。
さて、無限大でも0でもない2つの分数について、通分処理と似たような方法で足し算を行います。
互いの分母の最小公倍数(lcm)を求め、結果の分数の分母とします。
更に、互いの分子をlcm で通分してその結果を足し合わせます。最後に結果の分数を約分して、お終いですね。
ではこれを実際に使ってみましょう。
→ソースコード
{ // 1/3 を足してみる Fraction result = fraction.add(new Fraction(1, 3)); print(result); } { // 1/5 を足してみる Fraction result = fraction.add(new Fraction(1, 5)); print(result); }
結果はこうなりました。
result: 5/6 [false, false] result: 7/10 [false, false]
いやはや、足し算がようやく実装できました。これでほぼ一揃いかな?