Methoden Zahlensysteme umwandeln mittels Rekursion

Kahoona510

Mitglied
Hallo Java-Forum!

Kurz zu mir: ich lerne gerade Java, habe sehr viel Freude daran und komme auch gut vorwärts. Dieses Forum ist ja echt klasse, ich werde mich in Zukunft sicher hier beteiligen!

Vielleicht kann mir jemand bei folgender Aufgabenstellung auf die Sprünge helfen:

Ich möchte ein Programm schreiben, das eine beliebige Zahl aus einem beliebigem Zahlensystem in ein anderes, beliebiges Zahlensystem überträgt. Und das ganze nur mithilfe von Rekursion und ohne Methoden der Math.-Bibliothek.

Eine Eingabe könnte so aussehen:

1100 2 3

Würde bedeuten: "Die Zahl 1100 ist im Zweiersystem und soll ausgegeben werden im Dreiersystem."

Die Zahlensysteme gehen aber nur von 2 bis 10, also beim Dezimalsystem ist Schluß.

Meine Überlegungen dazu:
Wahrscheinlich ist es sinnvoll, jede eingegebene Zahl zunächst mal ins Dezimalsystem zu übertragen und dann erst ins gewünschte System. Ist das sinnig? Oder sollte ich lieber "on-the-fly" zum Beispiel vom 2er- ins 3er-System übertragen?

Wie gesagt, im Moment gehe ich davon aus, dass es sinnvoll ist, jede Zahl zunächst ins Dezimalsystem zu übertragen. Denn wie ich eine Dezimalzahl in jedes andere Zahlensystem übertragen kann, weiß ich.

Aber das "ins-Dezimalsystem-Umwandeln" bereitet mir Probleme, zumindest, wenn ich es rekursiv lösen soll. Denn wenn ich rekursiv aufrufe, habe ich keine Zählvariable, die mir sagt, an welcher Stelle der Zahl ich gerade bin. Und eine Zählvariable in den Funktionsparameter einzubinden ist wahrscheinlich schlechter Stil.

Bin ich auf dem Holz- oder auf dem richtigen Weg? 🙂

Beste Grüße
kahoona
 
Ich möchte es so aufbauen:

Java:
public class HUA0622 {
    public static void main (String[] args) {

        // Eingabe einlesen: die Zahl, das Quellsystem, das Zielsystem.
        int zahl = Integer.parseInt(args[0]);
        int qS = Integer.parseInt(args[1]);
        int zS = Integer.parseInt(args[2]);

        System.out.println(fromXToX(zahl, qS, zS));

    }

    // diese Funktion unterscheidet nachher, auf welche Funktionen die Parameter verteilt werden.
    public static int fromXToX (int zahl, int qS, int zS) {
      
    }

    // hier wird die Zahl aus einem beliebigen ins Dezimalsystem übersetzt.
    public static int fromXToDez (int zahl, int qS) {

    }

    // hier wird die Zahl aus dem Dezimalsystem ins gewünschte System übersetzt.
    public static int fromDezToX (int zahl, int zS) {

    }
}
 
Naja, wenn beim Dezimalsystem Schluss ist, kannst du als Abbruchbedingung so was wie zahl == 0 nehmen und die Rekursion mit fromXToDez(zahl / 10, qS) aufrufen. Dann musst du dir aber noch überlegen, wie du die Berechnung geschickt anstellst. Eine Zählvariable kannst du übrigens sehr wohl mit Hilfe einer Hilfsfunktion realisieren, die einen dritten Parameter enthält, der bei jedem Rekursionsschritt erhöht wird.

Mit freundlichen Grüßen
Xelsarion
 
Für die, die es interessiert:

ich habe es jetzt hinbekommen. Wahrscheinlich relativ holprig (Zählvariable als Parameter in einer rekursiven Funktion??), aber funktioniert.

Java:
import java.lang.Math;

/*    Ich könnte mir gut vorstellen, dass meine Lösung zu kompliziert ist, aber anders
    habe ich es nicht hinbekommen.
    Die eingegebene Zahl wird zunächst erst mal ins Dezimalsystem umgerechnet (Funktion fromXToDez).
    Die Dezimalzahl wird dann ins gewünschte Zahlensystem umgerechnet (Funktion FromDezToX).
    Die erste Funktion FromXToX ist nur dafür zuständig, diese Verteilung zu strukturieren und ggf. die Umrechnung
    ins Dezimalsystem zu überspringen, falls die gegebene Zahl schon eine Dezimalzahl ist. */

public class HUA0622 {
    public static void main (String[] args) {

        // Eingabe einlesen: die Zahl, das Quellsystem, das Zielsystem.
        long zahl = Long.parseLong(args[0]);
        int qS = Integer.parseInt(args[1]);
        int zS = Integer.parseInt(args[2]);

        System.out.println(fromXToX(zahl, qS, zS));

    }

    // diese Funktion entscheidet, auf welche Funktionen die Parameter verteilt werden.
    public static String fromXToX (long zahl, int qS, int zS) {

        if (qS == 10) {
            return fromDezToX (zahl, zS);
        }

        else {
            return fromDezToX(fromXToDez(zahl, qS, 0), zS);
        }
    }

    // Hier wird die Zahl ins Dezimalsystem übersetzt.
    // der dritte Parameter c ist eine Zählvariable. Wahrscheinlich kein guter Stil,
    // aber anders habe ich es nicht hinbekommen.
    public static long fromXToDez (long zahl, int qS, int c) {

        if (zahl == 0) {
            return 0;
        }

        else {
            long temp = (long) Math.pow(qS, c);
            return ( ((zahl%10)*temp) + fromXToDez(zahl/10, qS, c+1) );
        }

    }

    // hier wird die Zahl aus dem Dezimalsystem ins gewünschte System übersetzt.
    public static String fromDezToX (long zahl, int zS) {
        if (zahl == 0) {
            return "";
        }

        else {
            return (fromDezToX(zahl/zS, zS) + zahl%zS);
            }
    }
}
 

Zurück
Oben