Есть ли метод, который вычисляет факториал в Java? - PullRequest
92 голосов
/ 21 мая 2009

Я еще не нашел его. Я что-то пропустил? Я знаю, что метод факториала является распространенным примером программы для начинающих. Но не будет ли полезно иметь стандартную реализацию для повторного использования? Я мог бы использовать такой метод со стандартными типами (int, long ...) и с BigInteger / BigDecimal тоже.

Ответы [ 27 ]

0 голосов
/ 28 января 2019

Просто для удовольствия: однострочный факторный метод, который работает с BigInteger:

private static BigInteger calculateFactorial(BigInteger value) 
{
    return value.subtract(BigInteger.ONE).compareTo(BigInteger.ONE) == 0 ? value : value.multiply(calculateFactorial(value.subtract(BigInteger.ONE))); 
}
0 голосов
/ 21 февраля 2018

с рекурсией:

public static int factorial(int n)
{
    if(n == 1)
    {
        return 1;
    }               
    return n * factorial(n-1);
}

с циклом while:

public static int factorial1(int n)
{
    int fact=1;
    while(n>=1)
    {
        fact=fact*n;
        n--;
    }
    return fact;
}
0 голосов
/ 28 октября 2017

Я получил это от EDX использовать его! это называется рекурсия

   public static int factorial(int n) {
    if (n == 1) {
        return 1;
    } else {
        return n * factorial(n-1);
    }
}
0 голосов
/ 12 марта 2014
public static int fact(int i){
    if(i==0)
       return 0;
    if(i>1){
       i = i * fact(--i);
    }

   return i;
}
0 голосов
/ 28 июля 2017

цикл while (для небольших чисел)

public class factorial {

public static void main(String[] args) {
    int counter=1, sum=1;

    while (counter<=10) {
        sum=sum*counter;
        counter++;
   }

    System.out.println("Factorial of 10 is " +sum);
   }
}
0 голосов
/ 03 апреля 2016
public int factorial(int num) {
        if (num == 1) return 1;
        return num * factorial(num - 1);
}
0 голосов
/ 24 мая 2014

Нам нужно реализовать итеративно. Если мы реализуем рекурсивно, это вызовет StackOverflow, если ввод станет очень большим (то есть 2 миллиарда). И нам нужно использовать число несвязанного размера, такое как BigInteger, чтобы избежать арифметического переполнения, когда факториальное число становится больше максимального числа данного типа (то есть 2 миллиарда для целого). Вы можете использовать int для максимум 14 факториалов и long для максимум 20 факториала до переполнения.

public BigInteger getFactorialIteratively(BigInteger input) {
    if (input.compareTo(BigInteger.ZERO) <= 0) {
        throw new IllegalArgumentException("zero or negatives are not allowed");
    }

    BigInteger result = BigInteger.ONE;
    for (BigInteger i = BigInteger.ONE; i.compareTo(input) <= 0; i = i.add(BigInteger.ONE)) {
        result = result.multiply(i);
    }
    return result;
}

Если вы не можете использовать BigInteger, добавьте проверку ошибок.

public long getFactorialIteratively(long input) {
    if (input <= 0) {
        throw new IllegalArgumentException("zero or negatives are not allowed");
    } else if (input == 1) {
        return 1;
    }

    long prev = 1;
    long result = 0;
    for (long i = 2; i <= input; i++) {
        result = prev * i;
        if (result / prev != i) { // check if result holds the definition of factorial
            // arithmatic overflow, error out
            throw new RuntimeException("value "+i+" is too big to calculate a factorial, prev:"+prev+", current:"+result);
        }
        prev = result;
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...