import java.util.Objects;

public class Main {
    public static void main(String[] args) {
        // Z1 = 10 + 5i
        ComplexNumber z1 = new ComplexNumber(10.0, 5.0);
        z1.displayInfo();

        // Z2 = 3 + 4i
        ComplexNumber z2 = new ComplexNumber(3.0, 4.0);
        z2.displayInfo();

        System.out.println("\n--- Результат деления (Z1 / Z2) ---");

        try {
            // Выполняем деление: (10 + 5i) / (3 + 4i) = 2 - 1i
            ComplexNumber quotient = z1.divide(z2);
            quotient.displayInfo();
            // Ожидаемый результат: 2.0 - 1.0i

            // Проверка деления на себя (должно быть 1 + 0i)
            ComplexNumber one = z1.divide(z1);
            System.out.println("\n--- Результат деления (Z1 / Z1) ---");
            one.displayInfo();

            // Проверка деления на ноль
            ComplexNumber zero = new ComplexNumber(0, 0);
            System.out.println("\n--- Попытка деления на ноль ---");
            z1.divide(zero); // Вызовет исключение
            
        } catch (ArithmeticException e) {
            System.err.println(e.getMessage());
        }
    }
}

class ComplexNumber {
    private double real;      // Действительная часть
    private double imaginary; // Мнимая часть

    // Конструктор
    public ComplexNumber(double real, double imaginary) {
        setReal(real);      // Используем сеттеры для инициализации
        setImaginary(imaginary);
    }

    // ==================== Сеттеры (Безопасный доступ) ====================
    // Для double особые проверки не требуются, кроме базового присвоения.
    
    public void setReal(double real) {
        this.real = real;
    }

    public void setImaginary(double imaginary) {
        this.imaginary = imaginary;
    }

    // ======================== Геттеры =========================

    public double getReal() {
        return real;
    }

    public double getImaginary() {
        return imaginary;
    }
    
    // ======================== Логика Деления =========================

    /**
     * Вычисляет частное двух комплексных чисел: this / other.
     * Формула: Z1/Z2 = [(ac + bd) + i(bc - ad)] / (c^2 + d^2)
     * где Z1 = a + bi (this), Z2 = c + di (other)
     * 
     * @param other Комплексное число, на которое производится деление.
     * @return Новое комплексное число (результат деления).
     * @throws ArithmeticException Если делитель равен нулю (0 + 0i).
     */
    public ComplexNumber divide(ComplexNumber other) {
        // Z1 = a + bi
        double a = this.real;
        double b = this.imaginary;
        
        // Z2 = c + di
        double c = other.real;
        double d = other.imaginary;

        // Знаменатель: c^2 + d^2
        double denominator = c * c + d * d;

        // Проверка деления на ноль (0 + 0i)
        if (denominator == 0) {
            throw new ArithmeticException("Ошибка деления: Делитель не может быть равен нулю (0 + 0i).");
        }

        // Новая Действительная часть: (ac + bd) / (c^2 + d^2)
        double newReal = (a * c + b * d) / denominator;

        // Новая Мнимая часть: (bc - ad) / (c^2 + d^2)
        double newImaginary = (b * c - a * d) / denominator;

        // Возвращаем новый объект, представляющий результат
        return new ComplexNumber(newReal, newImaginary);
    }

    // ======================== Вывод информации =========================

    /**
     * Возвращает строковое представление комплексного числа.
     */
    @Override
    public String toString() {
        if (imaginary == 0) {
            return String.valueOf(real); // Только действительная часть
        }
        if (real == 0) {
            return imaginary + "i"; // Только мнимая часть
        }
        if (imaginary < 0) {
            // Убираем лишний знак минуса перед 'i' (e.g., "3 - 4i" вместо "3 + -4i")
            return real + " - " + (-imaginary) + "i";
        }
        return real + " + " + imaginary + "i";
    }
    
    /**
     * Вывод всей информации о числе.
     */
    public void displayInfo() {
        System.out.println("Комплексное число: Z = " + this.toString());
        System.out.println("  Действительная часть (Re): " + real);
        System.out.println("  Мнимая часть (Im): " + imaginary);
    }
}
