可以使用哪种数据类型来保持100,000,000的阶乘值?

时间:2013-06-30 19:46:32

标签: java types numbers

数据类型保持一个非常大的数字说1000或更多数字? 我需要找到一个大数据的因子说100000000。 我的阶乘程序适用于较小的数字。

long factorial(int x)
{
    long fact=1;
    if(x<0)
            {
        System.out.println("Incorrect input, enter a positive number");
        fact=0;
    }
    if(x==0)
        fact=1;
    if(x>0)
            {
            fact=x;
        fact=fact*factorial(x-1);

    }
    return fact;
}

3 个答案:

答案 0 :(得分:7)

您需要BigInteger。它可以容纳任意大数。

但在你的情况下100000000!是如此庞大的数字,没有什么可以帮助。

答案 1 :(得分:5)

你应该使用伽玛函数的日志,因为gamma(n) = (n-1)!远比你的天真,学生的做事方式更有效率。在这种情况下,它将是双倍的,并且自然日志的增长速度将比值更慢。

递归? 。你的问题不会是你传回的值的大小 - 在此之前你会得到太多的堆栈帧和内存不足错误。

答案 2 :(得分:1)

虽然BigInteger理论上会处理这样的值,但实际上你无法计算它。

首先,您的算法使用递归,因此您需要100.000.000次factorial的递归调用。在计算结果之前,您将获得堆栈溢出。您必须修改算法以避免递归(例如使用循环)。

其次,结果将是巨大。使用formulas for approximating factorials,例如

log n! ~~ n log(n/e)

我们可以得出结论,您的号码将超过750.000.000位数。虽然幸运的是你可能能够将它融入你的记忆中,但你肯定无法在任何合理的时间内计算出这个数字。试想一下 - 你必须用数亿的数字执行100.000.000次乘法。