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

import java.math.*;
import java.io.*; // Für FileWriter Klasse.

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) {
  // Da man auf der Konsole ggf. schnell den
  // Überblick verliert, lassen wir uns eine
  // Protokoll-Datei erzeugen.
  try { // Öffnen der Datei kann scheitern
  FileWriter fw = new FileWriter("protokoll.txt");
  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) {
	 String msg="FEHLER: berechne(" + i + ")=" + wert + " < vorgaenger=" + vorgaenger;
	 System.out.println(msg);
     fw.write(msg + "\n");
     fehler = true;
   }
   vorgaenger = wert;
   if(!BigInteger.valueOf(wert).equals(erwartet)) {
	 String msg = "FEHLER: berechne(" + i + ")=" + wert + " Erwartet: " + erwartet;
	 System.out.println(msg);
	 fw.write(msg + "\n");
     fehler = true;
   }
   if(!fehler) {
	 String msg = "OK: berechne(" + i + ")=" + wert;
	 System.out.println(msg);
	 fw.write(msg + "\n");
   }
  }
  }  catch (IOException e) {}
 }

 public static void main(String[] args) {
  /*************** weg ***********************\
  int eingabe = Eingabe.readInt("Bitte eine ganze Zahl eingeben: ");
  System.out.print(eingabe);
  System.out.print("! = ");
  System.out.println(berechne(eingabe));
  \**************** weg **********************/ 
  
  int von = -1, bis = 1000;
  System.out.println("Lasse Testschleife für berechne(i) laufen " +
                     "von i=" + von + " bis i=" + bis);
  test(von,bis);

  
 }

}