Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

StackOverFlowError with BigInteger in java

Why does this java code throw a StackOverflowError exception?

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

I have attempted to generate a factorial using BigInteger. But, why does my code give the reference exception on input?

like image 462
Nazmul Avatar asked Mar 12 '23 21:03

Nazmul


1 Answers

The issue is with your base case; n (which is a BigInteger) will not equal "0" (which is a String). So you continue to the else block, which re-curses. Also, BigInteger includes constants for ONE and ZERO so you could write something like

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

or using a ternary operation (conditional operator ? :) like

public static BigInteger fact(BigInteger n) {
    return (n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE)) ? BigInteger.ONE 
            : n.multiply(fact(n.subtract(BigInteger.ONE)));
}
like image 139
Elliott Frisch Avatar answered Mar 23 '23 08:03

Elliott Frisch