Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace Incapsulation.RationalNumbers
- {
- public class Rational
- {
- public int Numerator { get; set; }
- public int Denominator { get; set; }
- #region private_methods
- private void Reduce1()
- {
- Numerator = Numerator > 0 ? Numerator : -Numerator;
- Denominator = Denominator > 0 ? Denominator : -Denominator;
- int maxval = Numerator > Denominator ? Numerator : Denominator;
- for (int i = maxval; i >= 2; maxval--)
- if (Numerator % maxval == 0 && Denominator % maxval == 0)
- {
- Numerator /= maxval;
- Denominator /= maxval;
- break;
- }
- }
- private static int LowestCommonDenominator(int[] maxmin)
- {
- Array.Sort(maxmin);
- if (maxmin[1] % maxmin[0] == 0)
- return maxmin[1];
- int temp = 0;
- for (int i = 2; ; i++)
- {
- temp = maxmin[1] * i;
- if (temp % maxmin[0] == 0)
- break;
- }
- return temp;
- }
- #endregion
- public bool IsNan
- {
- get { return Denominator != 0 ? false : true; }
- }
- public Rational(int numerator, int denominator = 1)
- {
- if (numerator == 0)
- {
- Numerator = 0;
- Denominator = 1;
- }
- else if (numerator == denominator)
- {
- Numerator = 1;
- Denominator = 1;
- }
- else if (numerator > 0 && denominator > 0 || numerator < 0 && denominator < 0)
- {
- Numerator = numerator;
- Denominator = denominator;
- Reduce1();
- }
- else if (numerator < 0 || denominator < 0)
- {
- Numerator = numerator;
- Denominator = denominator;
- Reduce1();
- Numerator *= -1;
- }
- }
- public static Rational operator +(Rational a, Rational b)
- {
- if (a.Denominator == 0 || b.Denominator == 0)
- return new Rational(1, 0);
- Rational result1 = new Rational(1), result2 = new Rational(1);
- int minDecominator = LowestCommonDenominator(new int[2] { a.Denominator, b.Denominator });
- result1.Numerator = minDecominator / a.Denominator * a.Numerator;
- result2.Numerator = minDecominator / b.Denominator * b.Numerator;
- return new Rational(result1.Numerator + result2.Numerator, minDecominator);
- }
- public static Rational operator *(Rational a, Rational b)
- {
- if (a.Denominator == 0 || b.Denominator == 0)
- return new Rational(1, 0);
- return new Rational(a.Numerator * b.Numerator, a.Denominator * b.Denominator);
- }
- public static Rational operator -(Rational a, Rational b)
- {
- if (a.Denominator == 0 || b.Denominator == 0)
- return new Rational(1, 0);
- Rational result1 = new Rational(1), result2 = new Rational(1);
- int minDecominator = LowestCommonDenominator(new int[2] { a.Denominator, b.Denominator });
- result1.Numerator = minDecominator / a.Denominator * a.Numerator;
- result2.Numerator = minDecominator / b.Denominator * b.Numerator;
- return new Rational(result1.Numerator - result2.Numerator, minDecominator);
- }
- public static Rational operator /(Rational a, Rational b)
- {
- if (a.Denominator == 0 || b.Numerator == 0 || b.Denominator == 0)
- return new Rational(1, 0);
- return new Rational(a.Numerator / b.Numerator, a.Denominator / b.Denominator);
- }
- public static explicit operator int(Rational a)
- {
- if (a.Numerator == 0 & a.Denominator == 1) return 0;
- if (a.Denominator == 0 ||
- (a.Numerator != 0 && Math.Max(a.Numerator, a.Denominator) % Math.Min(a.Numerator, a.Denominator) != 0
- || (a.Numerator < a.Denominator)))
- throw new ArgumentException();
- return (a.Numerator / a.Denominator);
- }
- public static implicit operator double(Rational a)
- {
- if (a.Denominator == 0 || a.Numerator == 0) return double.NaN;
- return (double)a.Numerator / (double)a.Denominator;
- }
- public static implicit operator Rational(int a) => new Rational(a, 1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement