# Römische Zahlen



## sagaer (29. Okt 2012)

Ich brache Hilfe bei dieser Aufgabe, vielen Dank. 


Römische Zahlen sind aus Zahlenzeichen aufgebaut. Es gibt die folgenden Zahlenzeichen mit den
entsprechenden Einzelwerten:
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

Eine korrekte römische Zahl genügt den folgenden Regeln:
1. Vielfache von Einzelwerten werden durch Aneinanderreihen von Zahlenzeichen ausgedrückt,
z.B. ‘XXX‘ für 30.
2. Höherwertige Zahlenzeichen stehen vor niederwertigen, z.B. ‘XVII‘ für 17.
3. Es folgen nicht mehr als drei gleiche Zahlenzeichen nacheinander.
4. Restwerte von 400, 40 und 4 werden (in Ausnahme von Regel 2) ausgedrückt durch ‘CD‘,‘XL‘
und ‘IV‘, z.B. ‘LXLIV‘ für 94;

Schreiben Sie ein Programm Roman, das in einer Schleife alle römischen Zahlen von 1 bis 3999
berechnet und zusammen mit ihrer arabischen Repräsentation zeilenweise auf der Konsole ausgibt:
MMMCMXCIX 3999
MMMCMXCVIII 3998
…
*Hinweise:*
Verwenden Sie folgende Arrays zur Verwaltung der Abbildung zwischen römischen und arabischen
Zahlen.
int[] arabic = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
String[] roman = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};

Zur Umwandlung der Zahlenwerte in römische Zeichenketten können Sie beispielsweise wie folgt
vorgehen:
· Starten Sie mit der darzustellenden Zahl. Vergleichen Sie die Zahl mit den Werten zu den
römischen Zahlenzeichen in fallender Größe.
· Wenn die Zahl über dem Einzelwert liegt, wird das entsprechende Zeichen an den
Ergebnisstring angehängt. Der Wert des Zeichens wird von der Zahl subtrahiert.
· Ansonsten fahren Sie mit dem nächstkleineren Zahlenzeichen fort.


----------



## TryToHelp (29. Okt 2012)

Ok, das ist deine Aufgabe und was ist deine Frage?


----------



## Spewer (29. Okt 2012)

Was ist dir denn nicht klar ? 
Zeig doch schon einmal deine Ansätze (Code)


----------



## Tomate_Salat (29. Okt 2012)

1.) "Brauche Hilfe" - Der Titel trifft wohl auf 99% aller Themen im Forum zu ;-). Bitte in Zukunft genauer/aussagekräftiger
2.) Ich vermisse hier irgendwie deinen Ansatz. Aufgabenstellung posten + auf Lösung hoffen - ist nicht ;-)


----------



## Fab1 (29. Okt 2012)

Hallo,

[STRIKE]der Sinn von Aufgaben ist es diese selber zu lösen. Also was hast du denn bereits? Du wirst ja sicherlich einen Ansatz haben.[/STRIKE]

Wenn du jemanden suchst der dir die Aufgabe löst, dann poste es in der Jobbörse.

[EDIT]mir ist jetzt erst die Funktion aufgefallen, dass man hingewiesen wird, wenn in der Zwischenzeit jemand etwas gepostet hat. NICE![/EDIT]


----------



## TryToHelp (29. Okt 2012)

sagaer hat gesagt.:


> ...
> *Hinweise:*
> Verwenden Sie folgende Arrays zur Verwaltung der Abbildung zwischen römischen und arabischen
> Zahlen.
> ...



Hier steht doch was du machen sollst, also besser erklären geht kaum ;-)


----------



## Spacerat (29. Okt 2012)

:lol: ebensogut könnte der Titel "brauche Geld" heissen... bekommen tut man's deswegen auch nicht.

Aber zum Thema:
Es geht darum, Werte in verschiedene Zahlensysteme (hier römisch <-> arabisch).
Wenn dir römische Zahlen für den Anfang zu schwer sind (die haben's ehrlich gesagt in dieser Beziehung auch in sich) schau dir erst mal das Dual-, das Dezimal- und zum Schluss das Hexadezimalsystem an. Dann befasse dich 'ne Weile mit Zahlensystemen mit eineitlicher Basis und dann versuch dich in Systemen mit "kryptischer" Basis (eigene Wortschöpfung ), wie z.B. den römischen Zahlen. Die Verfahren sind zumindest ähnlich (nicht gleich, aber ähnlich).


----------



## TryToHelp (29. Okt 2012)

Wieso ist das Römische da jetzt schwer, bzw wie hilft die transvormation in dual,oktal,...

der Algorithmus ist doch schon beschrieben, die benötigten Arrays sind erstellt, das ist jetzt doch schon ziemlich simpel, wenn man sich die Hinweise genau anschaut. Und es wird ja wohl nicht die aller erste Zeile Java Code sein, die er implementieren muss.


```
while zahl > 0 {
schaue in array welche zahl rheinpasst, von groß nach klein (also von länge nach 0 durch dieses array gehen) 
schreibe diese und ziehe diese von zahl ab (selben index nehmen und aus roman array nehmen)
}
```
fertig


----------



## Spacerat (29. Okt 2012)

Okay, hab' nicht drauf geachtet, dass die Umrechnungsliste schon so genau vorgegeben war, hab' nur I->1, V->5 usw. gesehen und den Inhalt der Arrays nur überflogen. Das schwierige ist ja diese 3-Zeichen-Regel und die Wertigkeiten 1, 5, 10, 50, 100, 500, 1000.
In anderen Zahlensystemen haben einzelne Ziffern doch auch ihre Wertigkeit. Im römischen Zahlensystem fällt aber das Multiplizieren mit dem jeweiligen Stellenwert aus, stattdessen das regelt man das halt über diese dem TO vorgegebene Liste. So schwierig isset dann ja doch nicht.


----------



## hüteüberhüte (29. Okt 2012)

Moment, Regeln 1.-3. setzt der Algorithmus korrekt um, aber Regel 4 (Restwerte von 400, 40 und 4) muss irgendwie auch noch beachtet werden, oder?

Ansonsten

```
while (i > 0) {
  int j = arabic.length - 1;
  while (arabic[j] > i)
    j--;
  sout(roman[j]);
  i -= arabic[j];
}
```


----------



## Spacerat (29. Okt 2012)

Nee, das passt schon, deswegen sind 4er und 9er ja in der Liste, so können keine Restwerte grösser 3, 30 oder 300 bzw. nur Restwerte zwischen 6 und 8, 60 und 80 oder 600 und 800 übrig bleiben (hoffe das kommt richtig an, musste selber paar mal lesen).
Z.B. 8 - 5 = 3 also VIII oder 9 - 9 = 0 also IX


----------



## TryToHelp (30. Okt 2012)

Ich sag doch, der Algorithmus sowie das benötigte Array ist da, das sind ganz simple Zeilen code, nicht so kompliziert, wie ins duale oder hexadezimale System, einfacher vergleich und subtraktion, das sollte er hinbekommen :-D


----------



## Schorschbock (30. Okt 2012)

In Vielen X-beliebigen Lagern Campen Die Mädchen.
I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000 (alte Eselsbrücke)

Naja, vielleicht muss man sich am Anfang der Aufgabe nochmals ins Römische Zahlensystem ein wenig hineindenken. Das stand immerhin in der fünften Klasse im Mathe-Unterricht auf dem Lehrplan. Bei mir wäre das also schon ein Weilchen her und ganz so oft braucht man es im Alltag ja nun auch wieder nicht.
Prinzipiell kann man durch die beiden verschiedenen Berechnungssysteme (Additionsregel oder Subtraktionsregel) manchmal schon ein wenig ins Straucheln kommen.
Einen guten allgemeinen Überblick zu den Römischen Ziffern findet man hier und an vielen anderen Stellen im Netz.


----------



## TryToHelp (30. Okt 2012)

Ich verstehe nicht warum ihr alle sagt, das wäre schwer, wo doch alles schon in der Aufgabenstellung steht.
Das Römische Zahlensystem ist erstens einfach und muss man nicht verstehen (und es ist erklärt in der Aufgabenstellung)
Mit hilfe der gegeben Arrays und dem in prosa erklärtem Algorithmus sind das ein paar Zeilen code und fertig, ganz ohne zu denken, als hilfe kann man sich nochmal meine Pseudocode anschauen


----------



## TryToHelp (30. Okt 2012)

[WR]



Spoiler: Don't look at this





```
int[] arabic = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
String[] roman = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};

for (int i=0;i<3999;i++){
  String result="";
  String input=i;
  while (input>0){
    int counter=arabic.length-1;
    if (input>arabic[counter]){
      result=result+roman[counter];
      input=input-arabic[counter];
    }else{
      counter--;
    }
  }
  System.out.println(result+" "+i);
}
```



[/WR]


----------



## Spacerat (30. Okt 2012)

TryToHelp hat gesagt.:


> [WR]
> 
> 
> 
> ...


Besser ist das... enthält nämlich mindestens drei Flüchtigkeitsfehler (Zeilen 4, 6 & 9) aber never mind. 
@TryToHelp: 



Spoiler: If you don't agree, have a look at this.





```
int[] arabic = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
String[] roman = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};

for (int i=1;i<3999;i++){
  String result="";
  int input=i;
  int counter=arabic.length-1;
  while (input>0){
    if (input>=arabic[counter]){
      result=result+roman[counter];
      input=input-arabic[counter];
    }else{
      counter--;
    }
  }
  System.out.println(result+" "+i);
}
```


----------



## TryToHelp (30. Okt 2012)

Spacerat hat gesagt.:


> Besser ist das... enthält nämlich mindestens drei Flüchtigkeitsfehler (Zeilen 4, 6 & 9) aber never mind.



Mhh ja der String sollte ein int sein und noch einen Fehler in der Deklaration von counter, der wird so nicht runtergezählt =) aber nach den kleinen BugFixes müsste es gehen

Irgendwie bin ich ohne IDE ein echter noob =( jetzt weiß ich warum ich programmieren auf dem Papier hasse


----------



## Spacerat (30. Okt 2012)

TryToHelp hat gesagt.:


> Irgendwie bin ich ohne IDE ein echter noob =( jetzt weiß ich warum ich programmieren auf dem Papier hasse


[IRONIE]Ach weisst du, manchmal gewinnt man, aber meistens verlieren andere. Ich bin auch nur drauf gekommen, weil ich die Aussagen anderer natürlich überprüfen muss, damit ich was habe, wo ich drauf rum reiten kann.[/IRONIE] :lol:
Also, wie gehabt: Niemand ist unfehlbar, am allerwenigsten der Papst. Never mind.


----------



## hüteüberhüte (30. Okt 2012)

Ihr habt noch übersehen, dass von 3999 an rückwärts bis einschließlich 1 gezählt werden soll  Aber irgendetwas sollte man auch TO übrig lassen..


----------



## TryToHelp (30. Okt 2012)

@Spacerat

jaja ;-)

ja sieht gut aus dein code, das passiert, wenn man schnell mal was hier in die Eingabemaske tippt :-D



sagaer hat gesagt.:


> ...
> Schreiben Sie ein Programm Roman, das in einer Schleife alle römischen Zahlen von 1 bis 3999
> berechnet und zusammen mit ihrer arabischen Repräsentation zeilenweise auf der Konsole ausgibt:
> ...



mhh 1-3999 steht


----------



## hüteüberhüte (30. Okt 2012)

Trotzdem würde bei euch die 3999 fehlen.

Und geschrieben steht's:


sagaer hat gesagt.:


> berechnet und zusammen mit ihrer arabischen Repräsentation zeilenweise auf der Konsole ausgibt:
> MMMCMXCIX 3999
> MMMCMXCVIII 3998
> …



Aber was ärgerts mich. Macht wie denkt


----------



## TryToHelp (30. Okt 2012)

ok, muss <4000 sein

naja, da sind die Angaben in der Aufgabe inkonsistent, erst schreiben sie von 1-3999 und dann zeigen sie 3999-1 aber ist auch nicht zu kompliziert, wie auch der ganze Rest der Aufgabe ;-)


----------

