Umrechnen Basis 2-36, Probleme mit Basis 36

eclipseworker

Bekanntes Mitglied
Ich habe einen Code, wie ich in hier schon mal irgendwo gefunden habe, um ganze Zahlen in anderen Basen darzustellen (2-36):
Java:
 private String basisArray[]={"0", "1", "2", "3", "4", "5", "6", "7", "8", "9","A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "S", "T","U", "V", "W", "X", "Y", "Z"};
    public String zahlZurBasisRek(int zahl, int basis) {
        if(basis<2 || basis>basisArray.length){
            return "Error";
        }
        int rest;
        String ergebnis = "";
        if(zahl<0){
            zahl=Math.abs(zahl);
            ergebnis="-";
        }
        // Abbruchbedingung
        if(zahl < basis){
            return ""+zahl; 
        }
        rest = zahl % basis;
        ergebnis = basisArray[rest] + ergebnis;
        zahl = zahl / basis;
        return ergebnis + zahlZurBasisRek(zahl , basis);
    }
Das Ergebnis muss natürlich zu erst invertiert werden was aber kein Problem ist.
Ein paar Dinge bereiten mir Kopfzerbrechen:
Erstens bei negativen Zahlen ist das Minus an zweiter und nicht an erster Stelle, Basis 36 funktioniert nicht (gibt einen Error) und drittens suche ich einen Ansatz wie die Zahl als double eingeben kann. Den Ansatz dieser Methode erstmal den ganzen Zahlteil umzuwandeln und mich dann um den Rest zu kümmern habe ich schon:
Java:
public String zahlZurBasisRek(double zahl, int basis) {
        if(basis<2 || basis>basisArray.length){
            return "Error";
        }
        String r=""; // Zur Rückgabe
        r+=zahlZurBasisRek((int)zahl, basis);
        double hinternKomma=zahl-(int)zahl;
        if(hinternKomma!=0){
               r+=".";
               while(hinternKomma!=(int)hinternKomma){
                     hinternKomma*=basis;
                     r+=(int)hinternKomma;
                     hinternKomma-=(int)hinternKomma;
               }
        }
     return r;
}
Aber irgendwie funktioniert das nicht.
 
Zuletzt bearbeitet:
> Erstens bei negativen Zahlen ist das Minus an zweiter und nicht an erster Stelle
schau dir doch an wie du deinen Code zusammensetzt, was passiert mit der ergebnis-Variable, falls sie zunächst auf "-" gesetzt wird?
das musst du anders bearbeiten, das "-" separat speichern bzw. nur einen boolean und am Ende, nach der Rekursion als letzten Schritt vorne an "-" anfügen

> Basis 36 funktioniert nicht (gibt einen Error)
welch ein simpler Fehler, nicht mal den untersuchst du selber?
wie man an deinem if sieht, kann das ja eigentlich nur sein, wenn das Array nicht 36 lang ist,
und tatsächlich ist es nur 35 lang, das hast du nie auch nur einmal ausgegeben?
welcher Buchstabe jetzt fehlt muss man hoffentlich nicht auch noch vorsagen 😉

beim double-Rest schreibst du keine Fehlermeldung,
ich vermute Endlosschleife, das wäre jedenfalls ein denkbarer Fehler:
0.2, Basis 6 -> 1.2, 1 wird abgeschnitten, 0.2 bleibt, dasselbe Spiel von vorne,
falsch muss das nicht sein, ist dann so wie 1/3 = 0.3333.. im Dezimalsystem, musst nur auf Abbruch achten

falls noch andere Fehler bestehen dann die wenigsten etwas im Detail beschreiben
 
natürlich funktioniert 36 nicht ... genau so wenig wie 2 ... denn dein if prüft

größer als 2 ODER kleiner als 36 ...

korrekt müsste es aber lauten

größer-gleich 2 ODER kleiner-gleich 36 ...

also wird aus
Java:
if(basis<2||basis>36)
das hier
Java:
if(basis<=2||basis>=36)

auch würde ich hier von anfang an StringBuilder nutzen ... weil nichts anderes macht der compiler draus ...
 
natürlich funktioniert 36 nicht ... genau so wenig wie 2 ... denn dein if prüft

größer als 2 ODER kleiner als 36 ...

korrekt müsste es aber lauten

größer-gleich 2 ODER kleiner-gleich 36 ...

also wird aus
Java:
if(basis<2||basis>36)
das hier
Java:
if(basis<=2||basis>=36)

auch würde ich hier von anfang an StringBuilder nutzen ... weil nichts anderes macht der compiler draus ...
Wenn ich größer gleich 36 hernehme bekomme ich ein ArrayIndexOutOfBoundsException. 2 hingegen funktioniert gut.
 
naja ... weil du ja auch nur gesamt 35 elemente im array hast ... man sollte das alphabet schon können

... P , Q , R , S , T ...

vielleicht passt es dann ...

*sry ... aber selbst SlaterB hat das schon bemerkt ...
 
naja ... weil du ja auch nur gesamt 35 elemente im array hast ... man sollte das alphabet schon können

... P , Q , R , S , T ...

vielleicht passt es dann ...

*sry ... aber selbst SlaterB hat das schon bemerkt ...

Jetzt komme etwas blind vor. 😱
Übrigens der Minuspart klappt jetzt auch (es ist die seltene Gelegenheit wo die Reinfolge bei einer Addtion eine Rolle spielt:
Java:
ergebnis = ergebnis+basisArray[rest];
statt
Java:
ergebnis = basisArray[rest]+ergebnis;
. Das Nachkomma immer noch nicht.
 
wenn du strings anstatt mit "+" mit einem StringBuilder zusammensetzen würdest *wie es der compiler letztendlich übersetzt* dann wäre dir das eher aufgefallen ...
 
für den Fall dass atsächlich geändert wurde:
natürlich funktioniert 36 nicht ... genau so wenig wie 2 ... denn dein if prüft

größer als 2 ODER kleiner als 36 ...

korrekt müsste es aber lauten

größer-gleich 2 ODER kleiner-gleich 36 ...

also wird aus
Java:
if(basis<2||basis>36)
das hier
Java:
if(basis<=2||basis>=36)
??
falsch.., der Vergleich war vorher richtig, nichts zu ändern,
mit dem neuen Vorschlag würde 2 abgelegt, vorher nur alles KLEINER 2, also 1, 0, -1 usw
 

Zurück
Oben