Römische Zahlen

#41
Wenn ich wieder Unsinn gebaut habe: Über konstruktive Verbesserungsvorschläge freue ich mich immer!
Ich halte es für eine nicht so gute Idee, die Ausgabe mit in der Umwandlungsfunktion zu erledigen, da es dann keine "normale" Funktion mehr ist(Stattdessen hat sie dann als Rückgabetyp `IO String'), und du sie schlechter in anderen Berechnungen verwenden kannst. Stattdessen würde ich rome als Integer -> String umsetzen und die Ein/Ausgabe dann in main oder sonstwo erledigen.
Hier noch eine Variante in Haskell, die ich noch auf der Platte rumliegen hatte(keine Prüfung auf ungültige Eingaben):
Code:
import Data.List
import Data.Ord

digits = [("A",5000),("MA",4000),("M",1000),("CM",900),("D",500),("CD",400),("C",100),
          ("XC",90),("L",50),("XL",40),("X",10),("IX",9),("V",5),("IV",4),("I",1)]

toRoman 0 = ""
toRoman d = let match = head $ filter ((<=d) . snd) digits
            in fst match ++ (toRoman $ d - snd match)

toDec [] = 0
toDec str = let table = reverse $ sortBy (comparing (length . fst)) digits
                match = head $ filter ((`isPrefixOf` str) . fst) table
            in snd match + (toDec $ drop (length $ fst match) str)
 
#42
Java Lösung

Hier ist meine Java-Lösung:

public String umrechnen(int zahl){
String erg ="";

while(zahl >= 1000){
erg +="M";
zahl -= 1000;
}while(zahl >= 500){
erg +="D";
zahl -= 500;
}while(zahl >= 100){
erg +="C";
zahl -= 100;
}while(zahl >= 50){
erg +="L";
zahl -= 50;
}while(zahl >= 10){
erg +="X";
zahl -= 10;
}while(zahl >= 5){
erg +="V";
zahl -= 5;
}while(zahl >= 1){
erg +="I";
zahl -= 1;
}

return erg;
}

Ist übrigens mein erstes Java-Programm.
 
#44
Römische Zahlen Convertieren

Also ich habe das so gemacht(in c++), ist das ok?
mit dieser funktion:
Code:
string RomToDec(int x)
{
       int a=x;
       string numb;
       while(a>=1000)
       {
          numb+="M";
          a-=1000;
       };
       while(a>=500)
       {
          if(a>=900)
          {
             numb+="CM";
             a-=900;
          }
          numb+="D";
          a-=500;
       }
       while(a>=100)
       {
          if(a>=400){numb+="CD";a-=400;};
          if(a>100){numb+="C";a-=100;};
       }
       while(a>=50)
       {
          if(a==90){numb+="XC";a-=90;};
          if(a>=50){numb+="L";a-=50;};
       }
       while(a>=10)
       {
          if(a==40){numb+="XL";a-=40;};
          if(a>=10){numb+="X";a-=10;};
       }
       while(a>=5)
       {
          if(a==9){numb+="IX";a-=9;};
          if(a>=5){numb+="V";a-=5;};
       }
       while(a>=1)
       {
          if(a==4){numb+="IV";a-=4;};
          numb+="I";a-=1;
       }                                 
       return numb;
}
Scheint bei mir zu funktionieren...
 
Zuletzt bearbeitet von einem Moderator:
#45
norman1990:
Also ich habe das so gemacht(in c++), ist das ok?
Wenn es bei Dir funktioniert ist das ein guter Hinweis darauf das der Code ok ist...:wink:

Aber falls Du möchtest das sich jemand den Code näher ansieht, solltest Du in Zukunft beim posten von Code die Code-Tags nicht vergessen - das macht das ganze viel übersichtlicher und somit einfacher.
 
#46
die einfache methode in VB (nur schnell als konsolenanwendung geschrieben) als mein erster beitrag in diesem forum ^^

Code:
Module Module1

    Sub Main()
        Dim eingabe As Integer
        Dim roem As String = ""

        eingabe = CType(Console.ReadLine(), Integer)

        Do While eingabe > 0
            Select Case eingabe
                Case Is > 5000
                    eingabe -= 5000
                    roem &= "A"
                Case Is > 1000
                    eingabe -= 1000
                    roem &= "M"
                Case Is > 500
                    eingabe -= 500
                    roem &= "D"
                Case Is > 100
                    eingabe -= 100
                    roem &= "C"
                Case Is > 50
                    eingabe -= 50
                    roem &= "L"
                Case Is > 10
                    eingabe -= 10
                    roem &= "X"
                Case Is > 5
                    eingabe -= 5
                    roem &= "V"
                Case Else
                    eingabe -= 1
                    roem &= "I"
            End Select
        Loop

        Console.WriteLine(roem)
        Console.ReadLine()
    End Sub

End Module

1. edit: hatte die 5 bzw. V vergessen
2. edit: spoilercode
 
Zuletzt bearbeitet:
#47
nicht die kürzeste und effizienteste lösung aber tut was es soll :)

Code:
public class RomanianNumbers {
	public static int []umrechnen(int dezimal, int wert) {
		int ergebnis[] = new int[2];
		ergebnis[0] = 0;
		boolean ende = false;
		while (ende != true) {
			if ((dezimal - wert) >= 0) {
				dezimal -= wert;
				ergebnis[0]++;
			} else {
				ergebnis[1] = dezimal;
				ende = true;
			}
		}
		return ergebnis;
	}
	public static void main(String[] args) {
		System.out.println("Bitte geben Sie eine Zahl ein:");
		int dezimal = new java.util.Scanner(System.in).nextInt();
		int m[] = new int[2];
		int d[] = new int[2];
		int c[] = new int[2];
		int l[] = new int[2];
		int x[] = new int[2];
		int v[] = new int[2];
		int i[] = new int[2];
		m = umrechnen(dezimal, 1000);
		d = umrechnen(m[1], 500);
		c = umrechnen(d[1], 100);
		l = umrechnen(c[1], 50);
		x = umrechnen(l[1], 10);
		v = umrechnen(x[1], 5);
		i = umrechnen(v[1], 1);
		for (int j=0; j<m[0]; j++) {
			System.out.print("M");
		}
		for (int j=0; j<d[0]; j++) {
			System.out.print("D");
		}
		for (int j=0; j<c[0]; j++) {
			System.out.print("C");
		}
		for (int j=0; j<l[0]; j++) {
			System.out.print("L");
		}
		for (int j=0; j<x[0]; j++) {
			System.out.print("X");
		}
		for (int j=0; j<v[0]; j++) {
			System.out.print("V");
		}
		for (int j=0; j<i[0]; j++) {
			System.out.print("I");
		}
	}
}
 
Oben