public static String factorial(int n) {
        //add your code here
        if (n < 0) return "0";  // просто проверки на крайние значения
        if (n == 1 || n == 0) return "1";

        ArrayList<Integer> list = new ArrayList<>(); // лист в котором будем хранить разряды
        // если один или ноль уже вернем выше, а если больше то начать можно с 2 тк 1 при
        // умножении ничего не добавит
        list.add(2);
        for (int i = 3; i <= n; i++) {
            // тут просто умнажаем все элементы(разряды) листа на все цифры от 3 и до n по очереди
            multiply(list, i);
            format(list); // тут вся магия перестановки разрядов
        }

        // ниже просто переводим лист в стоку
        StringBuilder builder = new StringBuilder();
        list.forEach(builder::append); // склеиваем каждый элемент в строку

        return builder.toString(); // тут кто видел Builder все поймет))
    }

    // тут все просто сверху описал
    public static void multiply(ArrayList<Integer> list, int n) {
        for (int i = 0; i < list.size(); i++) {
            list.set(i, list.get(i) * n);
        }
    }

    public static void format(ArrayList<Integer> list) { //10 20
        // проходим по листу начиная с конца кроме 0го элемента
        for (int i = list.size() - 1; i > 0; i--) {
            int a = list.get(i); // берем число
            if (a > 9) { // если оно больше 9
                list.set(i, a % 10); // то кладем на его место только его последний разряд
                // а его первый разряд делим на 10 и прибавляем к старшему разряду
                // который лежит в предидущем (i-1) элементе листа
                // там-как у нас на каждом месте только один разряд
                // на десять делим что бы перевести число в старший разряд
                // тк 20 это 2 десятка, например
                list.set(i - 1, list.get(i - 1) + a / 10);
                // задом наперед как раз идем по этой причине
                // когда мы прибавим десятки к десяткам которые уже были в (i-1)
                // там может оказаться больше 9 например 15 десятков, что по сути 150
                // тогда на следующем витке цикла мы как раз и займемся этим элементом
                // сотни пойдут к сотням, а 5 десятков останется тут
            }
        }
        // в первом элементе т.е в самом старшем разряде
        // может оказаться цифра типа 98323 например
        // поэтому разбить ее на 5 разрядов
        while (list.get(0) > 9) {
            int a = list.get(0); // берем число
            list.set(0, a % 10); // отрываем от него последний разряд и оставляем в этой ячейке
            list.add(0, a / 10); //а всему отавшемуся повышаем разряд деля на 10
            // и кладем в 0ую ячейку и проделываем это до тех пор, пока не разобьем все разряды
        }
    }