在Java中查找大数的阶乘

时间:2012-07-12 07:29:43

标签: java factorial largenumber

我试图找到大量的阶乘,例如8785856采用for-loop和double数据类型的典型方式。

但结果显示无穷大,可能是因为它超出了极限。

所以请指导我找到一个非常大数的阶乘的方法。

我的代码:

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处理的概念。

14 个答案:

答案 0 :(得分:9)

您可能想重新考虑计算这个巨大的价值。 Wolfram Alpha's Approximation表明它肯定不适合你的主存储器显示。

答案 1 :(得分:8)

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 :(得分:6)

此代码应该可以正常工作: -

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));
    }
}

答案 3 :(得分:3)

提示:使用BigInteger类,并准备好为JVM提供大量内存。 8785856!的值非常大。

答案 4 :(得分:1)

使用班级BigInteger。 (我不确定这是否适用于如此庞大的整数)

答案 5 :(得分:1)

这个blog post用例子解释了java中的biginteger factorial。

答案 6 :(得分:0)

InfinityDouble类中的一个特殊保留值,当您超过a double可以容纳的最大数量时使用该值。

如果您希望代码正常工作,请使用BigDecimal类,但是如果输入了编号,请不要指望您的程序很快就能完成执行。

答案 7 :(得分:0)

使用BigInteger的上述问题解决方案(8785856!)如果不是几天,则需要几个小时的CPU时间。你需要确切的结果还是近似值?

有一种称为&#34; Sterling's Approximation的数学方法 &#34;这可以简单快速地计算,以下是Gosper的改进: enter image description here

答案 8 :(得分:0)

 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);

}
}

答案 9 :(得分:0)

试试这个:

import java.math.BigInteger;

public class LargeFactorial
{
    public static void main(String[] args)
    {
        int n = 50; 
    }
    public static BigInteger factorial(int n)
    {
       BigInteger result = BigInteger.ONE;
       for (int i = 1; i <= n; i++)
           result = result.multiply(new BigInteger(i + ""));
       return result;
    }
}

答案 10 :(得分:0)

    Scanner r = new Scanner(System.in);
    System.out.print("Input Number : ");
    int num = r.nextInt();
    int ans = 1;
    if (num <= 0) {
        ans = 0;
    }
    while (num > 0) {
        System.out.println(num + " x ");
        ans *= num--;
    }
    System.out.println("\b\b=" + ans);

答案 11 :(得分:0)

    public static void main (String[] args) throws java.lang.Exception
    {
        BigInteger fact= BigInteger.ONE;
        int factorialNo = 8785856 ;

        for (int i = 2; i <= factorialNo; i++) {
              fact = fact.multiply(new BigInteger(String.valueOf(i)));
        }

        System.out.println("Factorial of the given number is = " + fact);
     }

答案 12 :(得分:-1)

要真正找出这个数字的阶乘,你应该使用PYTHON函数,并尝试打开任务管理器,看看编译器需要多少内存。 之后你会知道JVM要花多少时间,因为PYTHON是数值计算的最佳语言。

答案 13 :(得分:-1)

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);
    }

}