Römische Zahlen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mback2k
Beiträge: 9
Registriert: 15.11.2008 14:04
Wohnort: Germany

Beitrag von mback2k »

Ja, mein Account wurde versehentlich gelöscht. Nunja, kann man nix machen. Hab schon mit Robert drüber gesprochen, meine alten Posts können mir nicht wieder zugewiesen werden, da die Admins keinen MySQL Zugang haben.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

Hier mein Versuch:

Code: Alles auswählen

EnableExplicit

Procedure.s Dec2Rom(Dec.i)
	Protected Rom.s = ""
	Protected stepDec.i = 1000
	
	While stepDec
		If Dec >= stepDec
			Select stepDec
				Case 1000 : Rom + "M"
				Case 900  : Rom + "CM"
				Case 500  : Rom + "D"
				Case 400  : Rom + "CD"
				Case 100  : Rom + "C"
				Case 90   : Rom + "XC"
				Case 50   : Rom + "L"
				Case 40   : Rom + "XL"
				Case 10   : Rom + "X"
				Case 9    : Rom + "IX"
				Case 5    : Rom + "V"
				Case 4    : Rom + "IV"
				Case 1    : Rom + "I"
			EndSelect
			Dec - stepDec
		Else
			Select stepDec
				Case 1000 : stepDec = 900
				Case 900  : stepDec = 500
				Case 500  : stepDec = 400
				Case 400  : stepDec = 100
				Case 100  : stepDec =  90
				Case 90   : stepDec =  50
				Case 50   : stepDec =  40
				Case 40   : stepDec =  10
				Case 10   : stepDec =   9
				Case 9    : stepDec =   5
				Case 5    : stepDec =   4
				Case 4    : stepDec =   1
				Case 1    : stepDec =   0
			EndSelect
		EndIf
	Wend
	ProcedureReturn Rom	
EndProcedure

Procedure.i Rom2Dec(Rom.s)
	Protected Dec.i = 0
	Protected cut.i
	Rom = UCase(Rom)
	
	While Rom <> ""
		If     Left(Rom,1) =  "M" : Dec + 1000 : cut = 1
		ElseIf Left(Rom,2) = "CM" : Dec +  900 : cut = 2
		ElseIf Left(Rom,1) =  "D" : Dec +  500 : cut = 1
		ElseIf Left(Rom,2) = "CD" : Dec +  400 : cut = 2
		ElseIf Left(Rom,1) =  "C" : Dec +  100 : cut = 1
		ElseIf Left(Rom,2) = "XC" : Dec +   90 : cut = 2
		ElseIf Left(Rom,1) =  "L" : Dec +   50 : cut = 1
		ElseIf Left(Rom,2) = "XL" : Dec +   40 : cut = 2
		ElseIf Left(Rom,1) =  "X" : Dec +   10 : cut = 1
		ElseIf Left(Rom,2) = "IX" : Dec +    9 : cut = 2
		ElseIf Left(Rom,1) =  "V" : Dec +    5 : cut = 1
		ElseIf Left(Rom,2) = "IV" : Dec +    4 : cut = 2
		ElseIf Left(Rom,1) =  "I" : Dec +    1 : cut = 1
		Else                                     : cut = 1
		EndIf
		Rom = Right(Rom, Len(Rom)-cut)
	Wend
	ProcedureReturn Dec
EndProcedure

Define rom.s
Macro TEST(__number__)
	rom = Dec2Rom(__number__)
	Debug Str(__number__) + "  =>  " + rom + "  =>  " + Str(Rom2Dec(rom))
EndMacro

TEST(1)
TEST(2)
TEST(3)
TEST(4)
TEST(5)
TEST(6)
TEST(9)
TEST(10)
TEST(11)
TEST(14)
TEST(19)
TEST(20)
TEST(1984)
TEST(1780)
TEST(1799)
TEST(1497)
- Das 5000er Zeichen habe ich nicht berücksichtigt!
- Die römische Zahl wird nicht auf Korrektheit überprüft!
- Falsche Zeichen in der römischen Zahl werden ignoriert!

cu, guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Hey, klappt super :D
Win11 x64 | PB 6.20
GCD_Chris
Beiträge: 6
Registriert: 15.08.2005 17:27

Beitrag von GCD_Chris »

IIII für 4 muß nicht pauschal falsch sein. IV ist auch eine Abkürzung des römischen Gottes Jupiter. Siehe dazu im Wiki, Kapitel "Besonderheiten".
Gruß, Christoph
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

QUID LICET IOVI
NON LICET BOVI

.. da sieht man auch, warum IV die Abkürzung sein kann... xD
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten