import algds.IOUtils;
/**
 * AlgDs WS99 Aufgabe 14.
 * Mann, Frau, Streit
 *
 * Zahl = 7, debug = false, tomax = false, nurstreit = false
 * liefert Kupferne Hochzeit  mit  Streit
 *
 * Zahl = 25, debug = false, tomax = false, nurstreit = false
 * liefert Silberne Hochzeit  ohne  Streit
 *
 * Zahl = 200, debug = false, tomax = true, nurstreit = true
 * liefert diese Tabelle:
 *
 * frau(0)=1, mann(0)=0, streit(0):x
 * frau(1)=1, mann(1)=0, streit(1):x
 * frau(2)=2, mann(2)=1, streit(2):x
 * frau(4)=3, mann(4)=2, streit(4):x
 * frau(7)=5, mann(7)=4, streit(7):x
 * frau(12)=8, mann(12)=7, streit(12):x
 * frau(20)=13, mann(20)=12, streit(20):x
 * frau(33)=21, mann(33)=20, streit(33):x
 * frau(54)=34, mann(54)=33, streit(54):x
 * frau(88)=55, mann(88)=54, streit(88):x
 * frau(143)=89, mann(143)=88, streit(143):x
 *
 * Aus diesen Werten erkennt man, dass die Streitjahre immer
 * seltener werden. Es gibt aber (theoretisch) in alle Ewigkeit
 * immer wieder mal Streit.
 * Man kann die Streitjahre auch ohne die Funktionen berechnen:
 *
 * S[0], S[1], S[2], S[3], S[4] ... bezeichne die Streitjahre
 * 0,    1,    2,    4,    7,   ...
 * mit wenig Mathematik findet man:
 * S[n] = S[n-1] + S[n-2] + 1
 * oder auch, wobei fib(n) die n-te Fibonacci-Zahl bezeichnet
 * (beginnend bei 0, also fib(0) = fib(1) = 1, fib(2) = 2):
 * S[n] = fib(n+1) - 1 = mann(S[n+1]) = frau(S[n+1]) - 1
 *
 * @author Christian Semrau, 6.11.1999, 24.12.1999
 * <a href="mailto:Christian.Semrau@student.uni-magdeburg.de">
 * Christian.Semrau@student.uni-magdeburg.de</a>
 */
public class ChS_Aufg14 {

static boolean debug=false;  // Alle Zwischenwerte ausgeben
static boolean tomax=false;  // alle von 1...n ausgeben
static boolean nurstreit=false;  // nur die Streitjahre ausgeben

static int[] mannwert; // die Tabelle der Werte fuer mann
static int manntop;
static int[] frauwert; // die Tabelle der Werte fuer frau
static int frautop;


static int frau(int n, String s) {
  int a,b;
  if (n<frautop) return(frauwert[n]);

  a = (n==0) ? (b = 1) : n - mann(b = frau(n-1, s+" "), s+" ");
  frauwert[frautop++] = a;

  if (debug)
	if (n==0)
	  System.out.print(s+"frau(0)="+a+"\n");
	else
	  System.out.print(s+"frau("+n+")="
	  +n+"-mann(frau("+(n-1)+"))="+n+"-mann("+b+")="+a+"\n" );

  return(a);
} // frau()
	

public static void main(String[] args) {
  int n;
  System.out.println("AlgDs WS99 Aufgabe 14, Christian Semrau, 06.11.1999");

  // Verwendet args.length, um die Anzahl der Parameter zu pruefen
  if (args.length<1) {
  // falsche Anzahl Parameter angegeben, Benutzereingaben holen
	System.out.print("Zahl: ");
	n = IOUtils.readInt();
	System.out.print("debug [j/n]:");
	debug = (IOUtils.readChar()=='j');
	System.out.print("tomax [j/n]:");
	tomax = (IOUtils.readChar()=='j');
	System.out.print("nurstreit [j/n]:");
	nurstreit = (IOUtils.readChar()=='j');
	System.out.println("");
  } else
  // Uebernahme von der Kommandozeile
  try {
	n = new Integer(args[0]).intValue();
	for (int i=1; i<args.length; i++) {
	  if (args[i].equals("debug")) debug=true; else
	  if (args[i].equals("tomax")) tomax=true; else
	  if (args[i].equals("nurstreit")) nurstreit=true; else
	System.out.println(
	"debug = Unteraufruefe anzeigen (bis n=20)\n"+
	"tomax = alle von 0 bis n anzeigen\n"+
	"nurstreit = in Verbindung mit tomax nur Streitjahre anzeigen");
	}
  }
  catch(NumberFormatException e) {
  // keine Zahl
	System.out.println("Eine Zahl >=0 als Parameter!");
	return;
  };
  if (n<0) {
	System.out.println("Eine Zahl >=0 als Parameter!");
	return;
  };
  if (n>=1000) {
	System.out.println("Funktioniert leider nur bis 999.");
	return;
  };
  if (n>20) debug=false; // das sieht dann nicht mehr schoen aus

  mannwert = new int[1000]; manntop = 0;
  frauwert = new int[1000]; frautop = 0;

  if (tomax)
	for (int i=0; i<=n; i++) {
	  boolean st=streit(i);
	  if (st || !nurstreit) {
		System.out.print("frau("+i+")="+frau(i,"")+", ");
		System.out.print("mann("+i+")="+mann(i,"")+", ");
		System.out.println("streit("+i+"):"+ (st ? "x" : "-") );
	  }
	}
  else {
	System.out.println("frau("+n+")="+frau(n,""));
	System.out.println("mann("+n+")="+mann(n,""));
	System.out.println("streit("+n+")="+streit(n));
  }
} // main()
	

static int mann(int n, String s) {
  int a,b;
  if (n<manntop) return(mannwert[n]);

  a = (n==0) ? (b = 0) : n - frau(b = mann(n-1, s+" "), s+" ");
  mannwert[manntop++] = a;

  if (debug)
	if (n==0)
	  System.out.print(s+"mann(0)="+a+"\n");
	else
	  System.out.print(s+"mann("+n+")="
	  +n+"-frau(mann("+(n-1)+"))="+n+"-frau("+b+")="+a+"\n" );

  return(a);
} // mann()
	

static boolean streit(int n) {
  return mann(n, "") != frau(n, "");
}
	
} // class ChS_Aufg14