Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- namespace Fraction
- {
- public static class IntExtensions
- {
- public static int GCD(this int a, int b)
- {
- while (a != b)
- if (a > b) a -= b;
- else b -= a;
- return Math.Max(a, b);
- }
- }
- public class Fraction
- {
- private int _numerator;
- private int _denominator = 1;
- public int Numerator
- {
- get => _numerator;
- set
- {
- _numerator = value;
- Reduce();
- }
- }
- public int Denominator
- {
- get => _denominator;
- set
- {
- if (value == 0)
- throw new DivideByZeroException();
- _denominator = value;
- Reduce();
- }
- }
- public Fraction(int numerator, int denominator)
- {
- (Numerator, Denominator) = (numerator, denominator);
- }
- public static Fraction operator +(Fraction fraction) => fraction;
- public static Fraction operator -(Fraction fraction)
- => new Fraction(-fraction.Numerator, fraction.Denominator);
- public static Fraction operator +(Fraction a, Fraction b)
- => new Fraction(
- a.Numerator * b.Denominator + b.Numerator * a.Denominator,
- a.Denominator * b.Denominator
- );
- public static Fraction operator -(Fraction a, Fraction b)
- => a + (-b);
- public static Fraction operator *(Fraction a, Fraction b)
- => new Fraction(a.Numerator * b.Numerator, a.Denominator * b.Denominator);
- public static Fraction operator /(Fraction a, Fraction b)
- => new Fraction(a.Numerator * b.Denominator, a.Denominator * b.Numerator);
- public override string ToString() => $"{Numerator} / {Denominator}";
- public void Reduce()
- {
- NormalizeSign();
- var gcd = Math.Abs(_numerator)
- .GCD(Math.Abs(_denominator));
- _numerator /= gcd;
- _denominator /= gcd;
- }
- private void NormalizeSign()
- {
- var sign = Math.Sign(_numerator * _denominator);
- _denominator = Math.Abs(_denominator);
- _numerator *= sign;
- }
- }
- class Program
- {
- static void Main()
- {
- var a = new Fraction(1, 2);
- var b = new Fraction(1, 4);
- Console.WriteLine(a + b);
- Console.WriteLine(a / b);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement