在Java中使用BigInteger的StackOverFlowError

时间:2016-03-16 20:12:01

标签: java recursion stack-overflow biginteger

为什么这个java代码会抛出StackOverflowError个异常?

public class factorial2 {

     public BigInteger fact( BigInteger n)
     {
         BigInteger one = new BigInteger("1");
         if(n.equals("0"))
              return one;
         else
             return n.multiply(fact(n.subtract(one)));      
     }

     public static void main(String[] args) {       
        @SuppressWarnings("resource")
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        factorial2 f = new factorial2();
        for(int i=0;i<n;i++)
        {
           BigInteger b = sc.nextBigInteger();
           System.out.println(f.fact(b));
        }
        sc.close();
    }
}

我尝试使用BigInteger生成阶乘。但是,为什么我的代码在输入上给出引用异常?

2 个答案:

答案 0 :(得分:5)

问题在于您的基本情况; nBigInteger)不等于"0"String)。所以你继续else块,重新诅咒。此外,BigInteger包含ONEZERO的常量,因此您可以编写类似

的内容
public static BigInteger fact(BigInteger n) {
    if (n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE))
        return BigInteger.ONE;
    else
        return n.multiply(fact(n.subtract(BigInteger.ONE)));
}

使用三元操作(条件运算符? :),如

public static BigInteger fact(BigInteger n) {
    return (n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE)) ? BigInteger.ONE 
            : n.multiply(fact(n.subtract(BigInteger.ONE)));
}

答案 1 :(得分:2)

BigInteger #equals方法

public boolean equals(Object x) {
    // This test is just an optimization, which may or may not help
    if (x == this)
        return true;
    if (!(x instanceof BigInteger))
        return false;

此条件始终为假

if (n.equals("0"))

相反,请使用

if (BigInteger.ZERO.equals(n))