// This example is from _Java Examples in a Nutshell_. (http://www.oreilly.com)
// Copyright (c) 1997 by David Flanagan
// This example is provided WITHOUT ANY WARRANTY either expressed or implied.
// You may study, use, modify, and distribute it for non-commercial purposes.
// For any commercial use, see http://www.davidflanagan.com/javaexamples
// Import some other classes we'll use in this example.
// Once we import a class, we don't have to type its full name.
import java.math.BigInteger; // Import BigInteger from java.math package
import java.util.*; // Import all classes (including Vector) from java.util
/**
* This version of the program uses arbitrary precision integers, so it does
* not have an upper-bound on the values it can compute. It uses a Vector
* object to cache computed values instead of a fixed-size array. A Vector
* is like an array, but can grow to any size. The factorial() method is
* declared "synchronized" so that it can be safely used in multi-threaded
* programs. Look up java.math.BigInteger and java.util.Vector while
* studying this class.
**/
public class Factorial4 {
protected static Vector table = new Vector(); // create cache
static { table.addElement(BigInteger.valueOf(1)); } // initialize 1st element
/** The factorial() method, using BigIntegers cached in a Vector */
public static synchronized BigInteger factorial(int x) {
if (x |