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ую ячейку и проделываем это до тех пор, пока не разобьем все разряды
}
}Nik Grape
48 уровень
Для тех кто хочет поупражняться в алгоритмах а не в использовании BigDecimal и BigInteger
Обсуждается
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Nik Grape
27 октября 2021, 20:15
я честно говоря не знаю, думаю у них там все таки в виде строк все хранится
0
MisterMisix
26 октября 2021, 13:07
Правильно ли я понимаю, что методы класса BigInteger, например, основаны на такой же логике?
0
ГоффMaster
25 ноября 2022, 00:25
Не смотрел исходники методов BigInteger, но там стопудово именно строки, других вариантов просто нет.
0
Nik Grape
10 сентября 2021, 05:47
добавил коменты по просьбам трудящихся))
рад что кому то интересно))
+6
Nik Grape
9 сентября 2021, 00:01
все работает просто хотел предложить альтернативное решение
+3