Найти факториал больших чисел в Java

Я попытался найти факториал большого числа, например. 8785856 типичным способом с использованием циклического и двойного типов данных.

Но в результате он отображает бесконечность, может быть, потому что он превышает свой предел.

Итак, пожалуйста, назовите мне способ найти факториал очень большого числа.

Мой код:

class abc
{
    public static void main (String[]args)
    {
        double fact=1;
        for(int i=1;i<=8785856;i++)
        {
            fact=fact*i;
        }

        System.out.println(fact);
    }
}

Вывод: -

Infinity

Я новичок в Java, но выучил некоторые понятия IO-обработки и все.

Ответ 1

public static void main(String[] args) {
    BigInteger fact = BigInteger.valueOf(1);
    for (int i = 1; i <= 8785856; i++)
        fact = fact.multiply(BigInteger.valueOf(i));
    System.out.println(fact);
}

Ответ 2

Возможно, вы захотите пересмотреть расчет этого огромного значения. Приближение Wolfram Alpha предполагает, что он, безусловно, не поместится в вашей основной памяти, которая будет отображаться.

Ответ 3

Этот код должен работать нормально: -

public class BigMath {
    public static String factorial(int n) {
        return factorial(n, 300);
    }

    private static String factorial(int n, int maxSize) {
        int res[] = new int[maxSize];
        res[0] = 1; // Initialize result
        int res_size = 1;

        // Apply simple factorial formula n! = 1 * 2 * 3 * 4... * n
        for (int x = 2; x <= n; x++) {
            res_size = multiply(x, res, res_size);
        }

        StringBuffer buff = new StringBuffer();
        for (int i = res_size - 1; i >= 0; i--) {
            buff.append(res[i]);
        }

        return buff.toString();
    }

    /**
     * This function multiplies x with the number represented by res[]. res_size
     * is size of res[] or number of digits in the number represented by res[].
     * This function uses simple school mathematics for multiplication.
     * 
     * This function may value of res_size and returns the new value of res_size.
     */
    private static int multiply(int x, int res[], int res_size) {
        int carry = 0; // Initialize carry.

        // One by one multiply n with individual digits of res[].
        for (int i = 0; i < res_size; i++) {
            int prod = res[i] * x + carry;
            res[i] = prod % 10; // Store last digit of 'prod' in res[]
            carry = prod / 10;  // Put rest in carry
        }

        // Put carry in res and increase result size.
        while (carry != 0) {
            res[res_size] = carry % 10;
            carry = carry / 10;
            res_size++;
        }

        return res_size;
    }

    /** Driver method. */
    public static void main(String[] args) {
        int n = 100;

        System.out.printf("Factorial %d = %s%n", n, factorial(n));
    }
}

Ответ 4

Подсказка: используйте класс BigInteger и будьте готовы предоставить JVM много памяти. Значение 8785856! - действительно большое число.

Ответ 5

Используйте класс BigInteger. (Я не уверен, что это будет работать даже для таких огромных целых чисел)

Ответ 6

Это сообщение в блоге объясняет факториал biginteger в java примерами.

Ответ 7

Infinity является специальным зарезервированным значением в Double, если вы превысили максимальное число, которое может удерживать a Double.

Если вы хотите, чтобы ваш код работал, используйте класс BigDecimal, но, учитывая введенный номер, не ожидайте, что ваша программа завершит выполнение в ближайшее время.

Ответ 8

Вышеупомянутые решения для вашей проблемы (8785856!) с использованием BigInteger потребуют буквально часов процессорного времени, если не дней. Вам нужен точный результат или достаточное приближение?

Существует математический подход, называемый Стерлинг-аппроксимация ", которые можно вычислить просто и быстро, и следующее улучшение Gosper: введите описание изображения здесь

Ответ 9

 import java.util.*;
 import java.math.*;

class main
{
public static void main(String args[])
{
    Scanner sc= new Scanner(System.in);

        int i;
        int n=sc.nextInt();


      BigInteger fact = BigInteger.valueOf(1);

        for ( i = 1; i <= n; i++)
        {
            fact = fact.multiply(BigInteger.valueOf(i));
        }
        System.out.println(fact);

}
}

Ответ 10

import java.util.Scanner;


public class factorial {
    public static void main(String[] args) {
        System.out.println("Enter the number : ");
        Scanner s=new Scanner(System.in);
        int n=s.nextInt();
        factorial f=new factorial();
        int result=f.fact(n);
        System.out.println("factorial of "+n+" is "+result);
    }
    int fact(int a)
    {
        if(a==1)
            return 1;
        else
            return a*fact(a-1);
    }

}

Ответ 11

Чтобы действительно узнать факториал этого номера, вы должны использовать функции PYTHON и попытаться открыть диспетчер задач и посмотреть, сколько памяти занимает компилятор. После этого вы узнаете, сколько времени займет JVM, поскольку PYTHON - лучший язык для численных расчетов.