Factorial for java中的大数字

时间:2016-11-30 04:53:15

标签: java biginteger factorial

我一直在努力解决这个问题recursive function,但找不到自己导致我overflow error而且它不断出现。我已经尝试过投射到BigInteger,但没有什么特别的。我的Eclipse IDE中没有看到任何警告或语法错误。我必须为大数字提交一个有效的算法。提前致谢。 : - )

public static BigInteger factorial(int n)
{
    return n > 2 ? new BigInteger(n+"").multiply(factorial(n-1)) : new BigInteger(n+"");
}

1 个答案:

答案 0 :(得分:1)

问题

您收到错误是因为计算机必须记住您所做的每个方法调用(以及其他信息),直到该方法调用完成,并且“堆栈”上只有这么多空间留出来记住所有这些。

你进行了多次递归,以便溢出设置的堆栈空间以记住正在进行的方法调用。这称为堆栈溢出。

可能的解决方案

合理有效的算法是使用简单的循环。这样做的另一个好处就是不会导致堆栈溢出,因为你不会反复创建更多的方法调用,只需在第一个方法调用中执行操作。

您还应该使用BigInteger.valueOf(n)代替new BigInteger(n+"")

public static BigInteger factorial(int n) {
    BigInteger result = BigInteger.ONE;
    for (; n > 1; n--) {
        result = result.multiply(BigInteger.valueOf(n));
    }
    return result;
}

这需要我的电脑大约6秒来计算100,000!

更有效的解决方案

有比这更快的算法。有关详细信息,请参阅another question及其链接。