0

保存一个非常大的数字的数据类型,比如 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;
}
4

3 回答 3

7

你需要一个BigInteger. 它可以容纳任意大的数字。

但是在您的情况下100000000!,数字如此庞大,没有任何帮助。

于 2013-06-30T19:47:40.550 回答
5

您应该使用 gamma 函数的日志,因为比您幼稚的学生做事方式gamma(n) = (n-1)! 要高效得多。在这种情况下,它将是双倍的,自然对数的增长速度将比值慢。

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

于 2013-06-30T19:50:50.910 回答
1

虽然BigInteger理论上可以处理这样的值,但您将无法在实践中计算它。

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

其次,结果将是巨大的。使用近似阶乘的公式,例如

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

我们可以得出结论,您的号码将超过 750.000.000 位。虽然运气好的话,您可能能够将其放入您的记忆中,但您肯定无法在任何合理的时间内计算出这个数字。试想一下——你必须对数以亿计的数字进行 100.000.000 次乘法运算。

于 2013-07-01T11:41:49.127 回答