Advertisement
petr_makarov

Fraction (improved)

Nov 28th, 2022
589
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.63 KB | None | 0 0
  1. using System;
  2.  
  3. namespace Fraction
  4. {
  5.     public static class IntExtensions
  6.     {
  7.         public static int GCD(this int a, int b)
  8.         {
  9.             while (a != b)
  10.                 if (a > b) a -= b;
  11.                 else b -= a;
  12.  
  13.             return Math.Max(a, b);
  14.         }
  15.     }
  16.  
  17.     public class Fraction
  18.     {
  19.         private int _numerator;
  20.         private int _denominator = 1;
  21.  
  22.         public int Numerator
  23.         {
  24.             get => _numerator;
  25.             set
  26.             {
  27.                 _numerator = value;
  28.                 Reduce();
  29.             }
  30.         }
  31.  
  32.         public int Denominator
  33.         {
  34.             get => _denominator;
  35.             set
  36.             {
  37.                 if (value == 0)
  38.                     throw new DivideByZeroException();
  39.  
  40.                 _denominator = value;
  41.                 Reduce();
  42.             }
  43.         }
  44.  
  45.         public Fraction(int numerator, int denominator)
  46.         {
  47.             (Numerator, Denominator) = (numerator, denominator);
  48.         }
  49.  
  50.         public static Fraction operator +(Fraction fraction) => fraction;
  51.         public static Fraction operator -(Fraction fraction)
  52.             => new Fraction(-fraction.Numerator, fraction.Denominator);
  53.  
  54.         public static Fraction operator +(Fraction a, Fraction b)
  55.             => new Fraction(
  56.                 a.Numerator * b.Denominator + b.Numerator * a.Denominator,
  57.                 a.Denominator * b.Denominator
  58.             );
  59.  
  60.         public static Fraction operator -(Fraction a, Fraction b)
  61.             => a + (-b);
  62.  
  63.         public static Fraction operator *(Fraction a, Fraction b)
  64.             => new Fraction(a.Numerator * b.Numerator, a.Denominator * b.Denominator);
  65.  
  66.         public static Fraction operator /(Fraction a, Fraction b)
  67.             => new Fraction(a.Numerator * b.Denominator, a.Denominator * b.Numerator);
  68.  
  69.         public override string ToString() => $"{Numerator} / {Denominator}";
  70.  
  71.         public void Reduce()
  72.         {
  73.             NormalizeSign();
  74.  
  75.             var gcd = Math.Abs(_numerator)
  76.                 .GCD(Math.Abs(_denominator));
  77.  
  78.             _numerator /= gcd;
  79.             _denominator /= gcd;
  80.         }
  81.  
  82.         private void NormalizeSign()
  83.         {
  84.             var sign = Math.Sign(_numerator * _denominator);
  85.             _denominator = Math.Abs(_denominator);
  86.             _numerator *= sign;
  87.         }
  88.     }
  89.  
  90.     class Program
  91.     {
  92.         static void Main()
  93.         {
  94.             var a = new Fraction(1, 2);
  95.             var b = new Fraction(1, 4);
  96.  
  97.             Console.WriteLine(a + b);
  98.             Console.WriteLine(a / b);
  99.         }
  100.     }
  101. }
  102.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement