Факториал числа в Java — программа через цикл for
Факториал натурального числа n (записывается как n!) — это произведение всех целых чисел от 1 до n. Например, 5! = 1 × 2 × 3 × 4 × 5 = 120. Факториал нуля по соглашению равен 1.
В Java факториал удобно вычислять с помощью циклов. Покажем три способа решения этой задачи.
Пример 1: с использованием цикла for
В этом примере мы пробегаем по всем числам от 1 до num с помощью цикла for и накапливаем их произведение в переменной factorial.
public class Factorial {
public static void main(String[] args) {
int num = 10;
long factorial = 1;
for(int i = 1; i <= num; ++i)
{
// factorial = factorial * i;
factorial *= i;
}
System.out.printf("Factorial of %d = %d", num, factorial);
}
}
Вывод:
Factorial of 10 = 3628800
В этой программе цикл for перебирает все числа от 1 до заданного num (10), а произведение всех чисел до num сохраняется в переменной factorial.
Мы используем тип long вместо int, чтобы хранить большие значения факториала. Однако даже long не справится с по-настоящему большими числами (например, для 100!).
Совет
Если результат не помещается в long, используйте класс BigInteger из библиотеки java.math — он умеет работать с целыми числами любой длины.
Пример 2: вычисление факториала с помощью BigInteger
Здесь вместо long используется BigInteger, что позволяет работать с очень большими значениями факториала.
import java.math.BigInteger;
public class Factorial {
public static void main(String[] args) {
int num = 30;
BigInteger factorial = BigInteger.ONE;
for(int i = 1; i <= num; ++i)
{
// factorial = factorial * i;
factorial = factorial.multiply(BigInteger.valueOf(i));
}
System.out.printf("Factorial of %d = %d", num, factorial);
}
}
Вывод:
Factorial of 30 = 265252859812191058636308480000000
Примечание
Оператор * не работает с BigInteger, поэтому для умножения используется метод multiply(). Значение i нужно сначала преобразовать в BigInteger с помощью BigInteger.valueOf(i).
Пример 3: вычисление факториала с помощью цикла while
Этот вариант делает то же самое, но через цикл while. Переменную-счётчик i приходится увеличивать вручную внутри тела цикла.
public class Factorial {
public static void main(String[] args) {
int num = 5, i = 1;
long factorial = 1;
while(i <= num)
{
factorial *= i;
i++;
}
System.out.printf("Factorial of %d = %d", num, factorial);
}
}
Вывод:
Factorial of 5 = 120
В отличие от for, при использовании while приращение счётчика i выполняется вручную внутри тела цикла.
Совет
Обе версии корректны, но когда количество итераций известно заранее (как здесь — до num), удобнее использовать цикл for.