// In diesem Programm gibt es gleich mehrere Probleme,
// und der Wertebereich von int ist nur eins davon...

import java.math.*;

public class Fakultaet {

 // Das ist die eigentliche Berechnungsroutine
 static int berechne(int i) {
  if(i <= 1) return 1;
  return i * berechne(i-1);
 }

 // Das ist die "genaue" Version
 static BigInteger fakultaet_2(int i) {
  if (i <= 1) return BigInteger.ONE;
  return BigInteger.valueOf(i).multiply(fakultaet_2(i-1));
 }

 static void test(int von, int bis) {
  int vorgaenger = -1;
  for(int i=von; i<=bis; i++) {
   boolean fehler = false;
   int wert = berechne(i);
   BigInteger erwartet = fakultaet_2(i);
   if(vorgaenger > wert) {
    System.out.println("FEHLER: berechne(" + i + ")=" + wert + " < vorgaenger=" + vorgaenger);
    fehler = true;
   }
   vorgaenger = wert;
   if(!BigInteger.valueOf(wert).equals(erwartet)) {
    System.out.println("FEHLER: berechne(" + i + ")=" + wert + " Erwartet: " + erwartet);
    fehler = true;
   }
   if(!fehler) System.out.println("OK: berechne(" + i + ")=" + wert);
  }
 }

 public static void main(String[] args) {
  // int eingabe = Integer.valueOf(args[0]).intValue();
  // System.out.print(eingabe);
  // System.out.print("! = ");
  // System.out.println(berechne(eingabe));
  int von = -1, bis = 1000;
  System.out.println("Lasse Testschleife für berechne(i) laufen " +
                     "von i=" + von + " bis i=" + bis);
  test(von,bis);
 }

}