Advertisement
Guest User

Untitled

a guest
Dec 5th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.77 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Incapsulation.RationalNumbers
  8. {
  9.     public class Rational
  10.     {
  11.         public int Numerator { get; set; }
  12.         public int Denominator { get; set; }
  13.  
  14.         #region private_methods
  15.  
  16.         private void Reduce1()
  17.         {
  18.             Numerator = Numerator > 0 ? Numerator : -Numerator;
  19.             Denominator = Denominator > 0 ? Denominator : -Denominator;
  20.  
  21.             int maxval = Numerator > Denominator ? Numerator : Denominator;
  22.             for (int i = maxval; i >= 2; maxval--)
  23.                 if (Numerator % maxval == 0 && Denominator % maxval == 0)
  24.                 {
  25.                     Numerator /= maxval;
  26.                     Denominator /= maxval;
  27.                     break;
  28.                 }
  29.         }
  30.  
  31.         private static int LowestCommonDenominator(int[] maxmin)
  32.         {
  33.             Array.Sort(maxmin);
  34.             if (maxmin[1] % maxmin[0] == 0)
  35.                 return maxmin[1];
  36.  
  37.             int temp = 0;
  38.             for (int i = 2; ; i++)
  39.             {
  40.                 temp = maxmin[1] * i;
  41.                 if (temp % maxmin[0] == 0)
  42.                     break;
  43.             }
  44.             return temp;
  45.         }
  46.         #endregion
  47.  
  48.         public bool IsNan
  49.         {
  50.             get { return Denominator != 0 ? false : true; }
  51.         }
  52.  
  53.         public Rational(int numerator, int denominator = 1)
  54.         {
  55.             if (numerator == 0)
  56.             {
  57.                 Numerator = 0;
  58.                 Denominator = 1;
  59.             }
  60.             else if (numerator == denominator)
  61.             {
  62.                 Numerator = 1;
  63.                 Denominator = 1;
  64.             }
  65.             else if (numerator > 0 && denominator > 0 || numerator < 0 && denominator < 0)
  66.             {
  67.                 Numerator = numerator;
  68.                 Denominator = denominator;
  69.                 Reduce1();
  70.  
  71.             }
  72.             else if (numerator < 0 || denominator < 0)
  73.             {
  74.                 Numerator = numerator;
  75.                 Denominator = denominator;
  76.                 Reduce1();
  77.                 Numerator *= -1;
  78.             }
  79.         }
  80.  
  81.         public static Rational operator +(Rational a, Rational b)
  82.         {
  83.             if (a.Denominator == 0 || b.Denominator == 0)
  84.                 return new Rational(1, 0);
  85.  
  86.             Rational result1 = new Rational(1), result2 = new Rational(1);
  87.             int minDecominator = LowestCommonDenominator(new int[2] { a.Denominator, b.Denominator });
  88.             result1.Numerator = minDecominator / a.Denominator * a.Numerator;
  89.             result2.Numerator = minDecominator / b.Denominator * b.Numerator;
  90.             return new Rational(result1.Numerator + result2.Numerator, minDecominator);
  91.         }
  92.        
  93.         public static Rational operator *(Rational a, Rational b)
  94.         {
  95.             if (a.Denominator == 0 || b.Denominator == 0)
  96.                 return new Rational(1, 0);
  97.  
  98.             return new Rational(a.Numerator * b.Numerator, a.Denominator * b.Denominator);
  99.         }
  100.  
  101.         public static Rational operator -(Rational a, Rational b)
  102.         {
  103.             if (a.Denominator == 0 || b.Denominator == 0)
  104.                 return new Rational(1, 0);
  105.  
  106.             Rational result1 = new Rational(1), result2 = new Rational(1);
  107.             int minDecominator = LowestCommonDenominator(new int[2] { a.Denominator, b.Denominator });
  108.             result1.Numerator = minDecominator / a.Denominator * a.Numerator;
  109.             result2.Numerator = minDecominator / b.Denominator * b.Numerator;
  110.             return new Rational(result1.Numerator - result2.Numerator, minDecominator);
  111.         }
  112.  
  113.         public static Rational operator /(Rational a, Rational b)
  114.         {
  115.             if (a.Denominator == 0 || b.Numerator == 0 || b.Denominator == 0)
  116.                 return new Rational(1, 0);
  117.  
  118.             return new Rational(a.Numerator / b.Numerator, a.Denominator / b.Denominator);
  119.         }
  120.  
  121.         public static explicit operator int(Rational a)
  122.         {
  123.             if (a.Numerator == 0 & a.Denominator == 1) return 0;
  124.  
  125.             if (a.Denominator == 0 ||
  126.                 (a.Numerator != 0 && Math.Max(a.Numerator, a.Denominator) % Math.Min(a.Numerator, a.Denominator) != 0
  127.                 || (a.Numerator < a.Denominator)))
  128.                 throw new ArgumentException();
  129.  
  130.             return (a.Numerator / a.Denominator);
  131.         }
  132.  
  133.         public static implicit operator double(Rational a)
  134.         {
  135.             if (a.Denominator == 0 || a.Numerator == 0) return double.NaN;
  136.             return (double)a.Numerator / (double)a.Denominator;
  137.         }
  138.  
  139.  
  140.         public static implicit operator Rational(int a) => new Rational(a, 1);
  141.     }
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement