/*
Datei............: Aufg0722.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 03.11.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 07.22
Kommentare.......:

Die einfachste Lösungsvariante besteht sicherlich darin, die
eingegebene Zahl in einen String zu konvertieren, die beiden
Ziffern mit Hilfe von Stringoperationen zu vertauschen und das
Ergebnis wieder in eine Ganzzahl umzuwandeln. Da die dazu
erforderlichen String-Routinen erst im nächsten Abschnitt
eingeführt werden, wollen wir eine arithmetische Variante 
implementieren. 

Dazu wird zunächst die Wertigkeit der zu vertauschenden 
Ziffern bestimmt, um die Ziffernwerte ermitteln zu können.
Das Berechnen der Zehnerpotenz nimmt uns die Hilfsmethode 
pow10 ab. Anschließend wird die erste Ziffer mit ihrer
Wertigkeit malgenommen und von der ursprünglichen Zahl 
abgezogen. Dadurch wird die entsprechende Stelle auf 0
gesetzt. Anschließend wird die zweite Ziffer mit der 
Wertigkeit der ersten Ziffer multipliziert und ebenfalls
zur Zahl addiert. Dadurch steht die zweite Ziffer nun
an der Stelle der ersten. Analog wird die zweite Ziffer
durch die erste ersetzt und das Ergebnis ist die gewünschte
zahl mit vertauschten Ziffern. Durch eine Reihe von 
Fehlerchecks verhindert das Programm, daß undefinierte
Ergebnisse entstehen.
*/
import java.io.*;

public class Aufg0722
{
  public static void main(String args[])
  {
    BufferedReader din = new BufferedReader(
		                 new InputStreamReader(System.in));
	long number;
	int i, j;

    System.out.println("Vertauschen von Ziffern");
    System.out.println("=======================");
	try {
	  while (true) {
		System.out.print("Zu bearbeitende Zahl [0=Ende]: ");
		number = Long.parseLong(din.readLine());
		if (number == 0) {
		  break;
		}
		System.out.print("Erste Tauschziffer: ");
		i = Integer.parseInt(din.readLine());
		System.out.print("Zweite Tauschziffer: ");
		j = Integer.parseInt(din.readLine());
		System.out.println(
		  "swapDigits(" + number + "," + i + "," + j +") = " + 
		  swapDigits(number, i, j)
		);
	  }
	} catch (IOException e) {
	  System.out.println(e.toString());
	}
  }

  static long swapDigits(long number, int i, int j)
  {
	int sign = (number < 0) ? -1 : 1;
	number *= sign;
	if (i != j) {
	  if (i >= 1 && j >= 1) {
		int nlen = ("" + number).length();
		if (i <= nlen && j <= nlen) {
		  long idigit = (number / pow10(nlen - i)) % 10;
		  long jdigit = (number / pow10(nlen - j)) % 10;
		  number += (jdigit - idigit) * pow10(nlen - i);
		  number += (idigit - jdigit) * pow10(nlen - j);
		}
	  }
	}
	return number * sign;
  }

  /**
   * Liefert das Ergebnis von 10 hoch n.
   */
  static long pow10(int n)
  {
	long ret = 1;
	while (n-- > 0) ret *= 10;
	return ret;
  }
}


