/// <summary> /// Works fine, after moderate testing. /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static ProperFraction operator *(ProperFraction a, ProperFraction b) { if (a == null || b == null) { throw new Exception(); } Int64 aN = a.decimalpart.getNumerator(), aD = a.decimalpart.getDenominator(); Int64 bN = b.decimalpart.getNumerator(), bD = b.decimalpart.getDenominator(); Int64 aI = a.integerpart, bI = b.integerpart; //Covert to improper fraction to elimiate integer part. aN += aI * aD; bN += bI * bD; //Does numerator of a share factor with denominator of b? Int64 factor1 = ImproperFraction.GCD(aN, bD); aN /= factor1; bD /= factor1; //Does the numerator of b share factor with the denominator of a? Int64 factor2 = ImproperFraction.GCD(bN, aD); bN /= factor2; aD /= factor2; //take care of the sign: bool negative = a.sign != b.sign; if (negative) { aN = -aN; } return(new ProperFraction(aN * bN, aD * bD)); }
/// <summary> /// construct an instance of proper fraction by inputing numerator and denominator. /// /// </summary> /// <param name="n"></param> /// Numerator. /// <param name="d"></param> /// Denominator /// If this is zero, then this class will throw an zero /// denominator exception. /// public ProperFraction(Int64 n, Int64 d) { if (d == 0) { throw new DividebyZeroException(); } if (n == 0) { this.integerpart = 0; decimalpart = new ImproperFraction(0, Math.Abs(d)); return; } sign = n < 0 == d < 0; n = Math.Abs(n); d = Math.Abs(d); Int64 integerdivide = n / d; integerpart = integerdivide; n = n % d; decimalpart = new ImproperFraction(n, d); }