Всем привет!
Начал создавать с нуля собственное CRUD приложение. Очень крутое задание, скажу я вам. Прям чувствуешь себя программистом. Это так, как говорится, держу в курсе :).
Ну а сегодня обещанная задача по вычислению факториала числа. Как обычно, сразу к делу:
Реализуйте метод factorial, вычисляющий факториал заданного натурального числа.
Ну погнали.
Для начала, как обычно, нужно понять, что от нас вообще хотят. А именно, что такое факториал. Википедия для любителей официальных формулировок. Своими словами если, то это последовательность чисел которая умножается друг на друга. Начинается умножение с единицы, заканчивается переданным числом. Например факториал числа 5:
5! = 1 * 2 * 3 * 4 * 5 = 120.
Далее.
Сразу возникает вопрос, что это за тип данных BigInteger и почему нет привычного int? Дело в том, что при вычислении факториала, получаются очень большие цифры, например факториал числа 16 = 20 922 789 888 000. А что если передать в метод 120? Страшно подумать.
Как мы знаем, максимальное значение типа данных int = 2147483647. Получается, что в большинстве случаев, нам не хватит вместимости этого типа данных. Тут нам на помощь приходит BigInteger. Вот здесь можно почитать про него. Как понятно из названия, этот тип данных позволяет хранить ну очень уж большие числа.
Итак, что нам понадобиться в этой задаче:
- BigInteger.ONE (статические поля BigInteger)
- multiply
- Оператор if.
- Оператор for.
Про оператор if и for, можно почитать здесь и здесь, но я думаю вы уже знакомы с ними, а про всё остальное написано по ссылке выше.
Первое, что нужно сделать, это отбросить такие варианты передаваемых чисел как: отрицательные числа, "0" и "1". Так как факториал любого из этих чисел будет равен "1". То есть пишем проверку в if на <= 1, и в случае true возвращаем BigInteger.ONE - фактически число 1. Можно конечно и просто вернуть обычную единицу, но правильнее будет использовать константу.
Далее
Для удобства, заводим новую переменную типа BigInteger и присваиваем ей значение константы BigInteger.ONE.
Теперь прописываем классический цикл for, где счетчиком будет являться переданное нам значение, так как нам нужно умножить ровно столько чисел, сколько передано в параметре.
Ну и самое интересное.
Мы должны на нашей новой переменной вызвать метод multiply, куда в качестве параметра передать наш счетчик из for. И главное не забыть, что счетчик это переменная типа int, а метод multiply работает с BigInteger, то есть нам нужно привести одно к другому. Соответствующий метод найдете в статье выше.
Всё это мы присваиваем опять-таки, нашей переменной и после закрытия цикла for, благополучно возвращаем через return.
Для проверки:
1 должен возвращать 1.
3 должно возвращать 5.
Кстати эту задачу тоже можно решить с помощью stream, но к этому мы вернемся когда, дойдем до этих самых stream-ов.
Ну что же, надеюсь всё понятно объяснил, если остались вопросы обязательно пишите, буду рад помочь, посоветовать что почитать, посмотреть.
В следующей задаче мы узнаем что такое рекурсия и как с её помощью решить эту же задачу.