# Römische Zahlen



## Chikorita (12. Apr 2005)

Hallo!

Ich muss ein Programm erstellen, das Zahlen in römische Zahlen umwandelt.
Leider stosse ich, je mehr ich auch verbessere, immer wieder auf Zahlen, bei denen es nicht so recht klappen will.

Kann mir bitte jemand sagen, was ich falsch mache?


```
import java.io.*;
import java.util.*;

public class pflicht2_4 {
    
    static int m = 3888; // Die maximal mögliche Zahl
    
    public static void main(String[] args) throws IOException {
        
        // Benötigte Variablen deklarieren
        String eingabeZeile;
        int dezimal;
        String roemisch = "";
        boolean davor = false;
        
        // Für die Eingabe von der Tastatur
        BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));
        
        System.out.print("Bitte geben Sie eine Dezimalzahl zwischen 1 und 3888 ein: ");
        
        // Eingabe, int-Wert einlesen
        eingabeZeile = eingabe.readLine();
        StringTokenizer tokens = new StringTokenizer(eingabeZeile);
        dezimal = Integer.parseInt(tokens.nextToken());
        
        // Um dafür zu sorgen, dass nur Zahlen der erlaubten Grösse eingegeben werden
        if (1 <= dezimal && dezimal  <= 3888) {
            
            do {
                
                // Um ein paar Sonderfälle zu behandeln
                if ((dezimal == 11 || (dezimal + 11) % 10 == 0) && davor == true) {
                    roemisch = "XI" + roemisch;
                    dezimal -= 11;
                }
                if ((dezimal == 9 || (dezimal + 9) % 10 == 0) && davor == true) {
                    roemisch = "IX" + roemisch;
                    dezimal -= 9;
                }
                if ((dezimal == 8 || (dezimal + 8) % 10 == 0) && davor == true) {
                    roemisch = "VIII" + roemisch;
                    dezimal -= 8;
                }
                if ((dezimal == 7 || (dezimal + 7) % 10 == 0) && davor == true) {
                    roemisch = "VII" + roemisch;
                    dezimal -= 7;
                }
                if ((dezimal == 6 || (dezimal + 6) % 10 == 0) && davor == true) {
                    roemisch = "VI" + roemisch;
                    dezimal -= 6;
                }
                
                // Die Zahl ist zwischen 1 und 3
                if (1 <= dezimal && dezimal <= 3) {
                    if (dezimal >= 1 && davor == false) {
                        roemisch = roemisch + "I";
                        dezimal -= 1;
                        davor = false;
                    }
                    else {
                        roemisch = "I" + roemisch;
                        dezimal -= dezimal - (1 - dezimal);
                        davor = true;
                    }
                }
                else {
                    // Die Zahl ist zwischen 4 und 8
                    if (4 <= dezimal && dezimal <= 8) {
                        // Die Zahl ist grösser oder gleich 5 und muss vor das bishere Ergebnis gesetzt werden
                        if (dezimal >= 5 && davor == false) {
                            roemisch = roemisch + "V"; // Die 5 wird hinten angehängt
                            dezimal -= 5; // Von der Ausgangszahl wird die verarbeitete 5 abgezogen
                            davor = false; // Die nächste Ziffer kommt hinter das bisherige Ergebnis
                        }
                        // Alle anderen Fälle
                        else {
                            roemisch = "V" + roemisch; // Die 5 wird vorne vorgesetzt
                            dezimal -= dezimal - (5 - dezimal); // Von der Ausgangszahl wird sie selbst und 5 - sie selbst abgezogen
                            davor = true; // Die nächste Zahl kommt vor das bisherige Ergebnis
                        }
                        // Die weiteren Anweisungsblöcke nach dem gleichen Prinzip mit angepassten Zahlen
                    }
                    else {
                        // Die Zahl ist zwischen 9 und 38
                        if (9 <= dezimal && dezimal <= 38) {
                            if (dezimal >= 10 && davor == false) {
                                roemisch = roemisch + "X";
                                dezimal -= 10;
                                davor = false;
                            }
                            else {
                                roemisch = "X" + roemisch;
                                dezimal -= dezimal - (10 - dezimal);
                                davor = true;
                            }
                        }
                        else {
                            // Die Zahl ist zwischen 39 und 88
                            if (39 <= dezimal && dezimal <= 88) {
                                if (dezimal >= 50 && davor == false) {
                                    roemisch = roemisch + "L";
                                    dezimal -= 50;
                                    davor = false;
                                }
                                else {
                                    roemisch = "L" + roemisch;
                                    dezimal -= dezimal - (50 - dezimal);
                                    davor = true;
                                }
                            }
                            else {
                                // Die Zahl ist zwischen 89 und 388
                                if (89 <= dezimal && dezimal <= 388) {
                                    if (dezimal >= 100 && davor == false) {
                                        roemisch = roemisch + "C";
                                        dezimal -= 100;
                                        davor = false;
                                    }
                                    else {
                                        roemisch = "C" + roemisch;
                                        dezimal -= dezimal - (100 - dezimal);
                                        davor = true;
                                    }
                                }
                                else {
                                    // Die Zahl ist zwischen 389 und 888
                                    if (389 <= dezimal && dezimal <= 888) {
                                        if (dezimal >= 500 && davor == false) {
                                            roemisch = roemisch + "D";
                                            dezimal -= 500;
                                            davor = false;
                                        }
                                        else {
                                            roemisch = "D" + roemisch;
                                            dezimal -= dezimal - (500 - dezimal);
                                            davor = true;
                                        }
                                    }
                                    else {
                                        // Die Zahl ist zwischen 889 und 3888
                                        if (889 <= dezimal && dezimal <= 3888) {
                                            if (dezimal >= 1000 && davor == false) {
                                                roemisch = roemisch + "M";
                                                dezimal -= 1000;
                                                davor = false;
                                            }
                                            else {
                                                roemisch = "M" + roemisch;
                                                dezimal -= dezimal - (1000 - dezimal);
                                                davor = true;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                
                System.out.println("D: " + dezimal + ", R: " + roemisch);
                
            }
            while (dezimal >= 1); // Abbruchbedingung
            
            // Ergebnis-Ausgabe
            System.out.println("Das entspricht der römischen Zahl: " + roemisch);
            
        }
        else {
            // Ausgabe der Fehlermeldung
            System.out.println("Ihre Zahl ist leider zu gross oder zu klein.");
        }
    }
}
```


----------



## DP (12. Apr 2005)

erzähl doch mal mehr zu deinem problem... wo hängt's denn?


----------



## Chikorita (12. Apr 2005)

Naja, wenn ich z.B. 543 eingebe, kommt VIILD raus, und ich weiss, dass das nicht stimmt.

Überhaupt kommt immer dann Murks raus, wenn die eingegeben Zahl ein bisschen kleiner ist als eine Schlüsselzahl (50, 100, 500, 1000 u.ä.).


----------



## DP (12. Apr 2005)

naja, ich sage mal mit nem debugger biste schneller am ziel als mit der warterei dass einer deinen code durchgeht...


----------



## semi (12. Apr 2005)

Wie geht es eigentlich nach 3999 weiter?

3999 = MMMCMXCIX bzw. verkürzt MMMIM

Was kommt dann? Z?


----------



## 0xdeadbeef (13. Apr 2005)

http://www.land.salzburg.at/hs-kuchl/hsk-math/roemer1.html


----------



## semi (13. Apr 2005)

So sollte es laufen. Ich habe aber keine Ahnung, wie es nach 4000 weitergeht.
Ergänze dazu die zwei Listen. { 4000, 5000, 9000, 10000, 40000, 49000, 50000 usw.}

```
public static String dec2rom(int number) {
  int d[] = { 1, 4, 5, 9, 10, 40, 49, 50, 90, 99, 100, 400, 490, 499, 500, 900, 990, 999, 1000 }; 
  String s[] = { "I", "IV", "V", "IX", "X", "XL", "IL", "L", "XC", "IC", "C", "CD", "XD", "ID", "D", "CM", "XM", "IM","M"};

  StringBuffer result = new StringBuffer();
  int n=number;
  //Solange noch ein Rest vorhanden
  while(n>0) {
    // Die Zahlenreihe rückwärts durchgehen
    for(int i=d.length-1; i>=0; i--) {
      // Akt. Zahl größer als n, mit nächster fortsetzen
      if(d[i]>n)
        continue;
      // Akt. Zahl anfügen
      result.append(s[i]);
      // und vom Gesamtwert abziehen
      n -= d[i];
      break;
    }
  }
  return result.toString();
}
```


----------



## Chikorita (13. Apr 2005)

Danke! Das funktioniert! *freu* 

Jetzt muss ich nur noch verstehen, WARUM das funktioniert, damit ich das dann nächste Woche meinem Lehrer erklären kann, aber ich denke, das krieg ich alleine hin.
Wenn nicht, melde ich mich nochmal!


----------

