В этой задаче необходимо разработать иммутабельный класс под названием BigInt, который должен представлять собой аналог класса BigInteger. Необходимо имплементировать: Конструктор, принимающий String: строковое представление числа и инициализирующий им внутренний динамический массив, содержарщий цифры числа final ArrayList digits. Знак числа необходимо установить во внутренней переменной типа boolean. Метод класса Object: toString, преобразовывающий число к строковому виду. Статический фабричный метод valueOf, принимающий long и создающий новый объект типа BigInt. Метод add, принимающий другой BigInt и возвращающий новое число, являющееся суммой исходного и переданного чисел. Метод не должен изменять ни текущее число, ни переданное (класс BigInt – иммутабельный) Метод subtract, принимающий другой BigInt и возвращающий новое число, являющееся разностью исходного и переданного чисел. Метод не должен изменять ни текущее число, ни переданное (класс BigInt – иммутабельный) Метод multiply, принимающий другой BigInt и возвращающий новое число, являющееся произведением исходного и переданного чисел. Метод не должен изменять ни текущее число, ни переданное (класс BigInt – иммутабельный) Метод divide, принимающий другой BigInt и возвращающий новое число, являющееся частным исходного и переданного чисел. Метод не должен изменять ни текущее число, ни переданное (класс BigInt – иммутабельный) Метод compareTo, принимающий другой BigInt и возвращающий значение типа int, равное 0, если числа равны, 1, если текущее число больше переданного числа, -1, если текущее число меньше переданного числа. Метод не должен изменять ни текущее число, ни переданное (класс BigInt – иммутабельный) Важно В этой задаче не нужно писать функцию main. Если потребуется, можете сделать import необходимых пакетов. Если вы ошибетесь в сигнатуре какого-то метода, либо забудете определить какой-то метод, то тестер упадет с ошибкой компиляции, поэтому будьте внимательны! При решении задачи, естественно, запрещается использовать класс BigInteger. Пример использования класса BigInt (например, в функции main): final BigInt a = BigInt.valueOf(123).multiply(BigInt.valueOf(44)).add(BigInt.valueOf(3)); final BigInt b = BigInt.valueOf(777).divide(BigInt.valueOf(7)).subtract(BigInt.valueOf(3)); final int c = a.compareTo(b); System.out.println(a + (c == 0 ? “ == “ : (c == -1 ? “ < “ : “ > “)) + b); Такой код должен вывести: 5415 > 108 Codestyle [2 балла]: стиль кода должен соответствовать стандартам, описанным в этом документе. Также, прикладываю полезную и простую статью Логика и понятность кода, оптимальность решения [5 баллов]: ваш код должен быть логичен, разделен на понятные структурные единицы, код должен читаться как текст. При необходимости, не стесняйтесь добавлять поясняющие комментарии. Код должен быть лаконичен: например, если можно обойтись тернарным оператором, вместо ветвления, лучше использовать именно тернарный оператор. Также в этом критерии оценивается удачность называния переменных. Корректность кода [4 балла]: ваш код должен работать не только на тестовых примерах, но и в любых остальных случаях, то есть все крайние случаи должны быть учтены. Асимптотическая оптимальность [1 балл]: методы multiply и divide должны работать за O(N^2), остальные методы и конструктор – за O(N), где – количество цифр в десятичной записи числа.