using System;

// Собственный класс исключения для нулевого знаменателя
public class NotCorrectlyDenominatorException : ArgumentException
{
    public NotCorrectlyDenominatorException(string message) 
        : base(message) { }
}

public class Fraction
{
    private int _numerator;
    private int _denominator;

    // Конструктор
    public Fraction(int numerator, int denominator)
    {
        Denominator = denominator; // Проверка через свойство
        Numerator = numerator;
        Simplify();
    }

    // Свойства
    public int Numerator
    {
        get => _numerator;
        set
        {
            _numerator = value;
            Simplify();
        }
    }

    public int Denominator
    {
        get => _denominator;
        set
        {
            if (value == 0)
                throw new NotCorrectlyDenominatorException("Знаменатель не может быть равен 0");
            
            // Переносим знак в числитель
            if (value < 0)
            {
                _numerator *= -1;
                _denominator = Math.Abs(value);
            }
            else
            {
                _denominator = value;
            }
        }
    }

    // Десятичное представление (только чтение)
    public double DecimalValue => (double)_numerator / _denominator;

    // Арифметические операции
    public Fraction Add(Fraction other)
    {
        int newNumerator = _numerator * other._denominator + other._numerator * _denominator;
        int newDenominator = _denominator * other._denominator;
        return new Fraction(newNumerator, newDenominator);
    }

    public Fraction Subtract(Fraction other)
    {
        int newNumerator = _numerator * other._denominator - other._numerator * _denominator;
        int newDenominator = _denominator * other._denominator;
        return new Fraction(newNumerator, newDenominator);
    }

    public Fraction Multiply(Fraction other)
    {
        int newNumerator = _numerator * other._numerator;
        int newDenominator = _denominator * other._denominator;
        return new Fraction(newNumerator, newDenominator);
    }

    public Fraction Divide(Fraction other)
    {
        int newNumerator = _numerator * other._denominator;
        int newDenominator = _denominator * other._numerator;
        return new Fraction(newNumerator, newDenominator);
    }

    // Упрощение дроби
    private void Simplify()
    {
        int gcd = GetGreatestCommonDivisor(Math.Abs(_numerator), Math.Abs(_denominator));
        _numerator /= gcd;
        _denominator /= gcd;
    }

    // Наибольший общий делитель (НОД)
    private int GetGreatestCommonDivisor(int a, int b)
    {
        while (b != 0)
        {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }

    // Строковое представление
    public override string ToString()
    {
        return $"{_numerator}/{_denominator}";
    }
}

// Пример использования
class Program
{
    static void Main()
    {
        try
        {
            Fraction a = new Fraction(1, 2);
            Fraction b = new Fraction(3, 4);

            Console.WriteLine($"a = {a}"); 
            Console.WriteLine($"b = {b}"); 

            Console.WriteLine($"Числитель a: {a.Numerator}"); 
            Console.WriteLine($"Знаменатель a: {a.Denominator}");
            Console.WriteLine($"Десятичное значение a: {a.DecimalValue}");

            Fraction sum = a.Add(b);
            Console.WriteLine($"Сумма: {sum}");

            Fraction difference = a.Subtract(b);
            Console.WriteLine($"Разность: {difference}");

            Fraction product = a.Multiply(b);
            Console.WriteLine($"Произведение: {product}");

            Fraction quotient = a.Divide(b);
            Console.WriteLine($"Деление: {quotient}");

            Fraction c = new Fraction(4, 8);
            Console.WriteLine($"Упрощение 4/8: {c}");

            Fraction d = new Fraction(5, 0); // Вызовет исключение
        }
        catch (NotCorrectlyDenominatorException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}