FileDocCategorySizeDatePackage
Factorial4.javaAPI DocExample2018Mon Sep 22 13:30:30 BST 1997None

Factorial4.java

// 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 < 0) throw new IllegalArgumentException("x must be non-negative.");
    for(int size = table.size(); size <= x; size++) {
      BigInteger lastfact = (BigInteger)table.elementAt(size-1);
      BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(size));
      table.addElement(nextfact);
    }
    return (BigInteger) table.elementAt(x);
  }

  /**
   * A simple main() method that we can use as a standalone test program
   * for our factorial() method.  
   **/
  public static void main(String[] args) {
    for(int i = 1; i <= 50; i++) System.out.println(i + "! = " + factorial(i));
  }
}