Römische Zahlen

sagaer

Mitglied
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.
 
Zuletzt bearbeitet von einem Moderator:
T

Tomate_Salat

Gast
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

Top Contributor
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]
 
T

TryToHelp

Gast
...
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.

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

Spacerat

Gast
: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).
 
Zuletzt bearbeitet von einem Moderator:
T

TryToHelp

Gast
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.

Code:
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
 
S

Spacerat

Gast
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

hüteüberhüte

Gast
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
Java:
while (i > 0) {
  int j = arabic.length - 1;
  while (arabic[j] > i)
    j--;
  sout(roman[j]);
  i -= arabic[j];
}
 
S

Spacerat

Gast
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
 
T

TryToHelp

Gast
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

Neues Mitglied
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.
 
T

TryToHelp

Gast
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
 
T

TryToHelp

Gast
[WR]
Java:
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]
 
S

Spacerat

Gast
[WR]
Java:
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]
Besser ist das... enthält nämlich mindestens drei Flüchtigkeitsfehler (Zeilen 4, 6 & 9) aber never mind. ;)
@TryToHelp:
Java:
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);
}
 
Zuletzt bearbeitet von einem Moderator:
T

TryToHelp

Gast
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
 
S

Spacerat

Gast
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

hüteüberhüte

Gast
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..
 
T

TryToHelp

Gast
@Spacerat

jaja ;-)

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

...
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
 
T

TryToHelp

Gast
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 ;-)
 

Neue Themen


Oben