Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Karcrack en 16 Diciembre 2010, 16:27 pm



Título: [SNIPPET] Decimal a Romano
Publicado por: Karcrack en 16 Diciembre 2010, 16:27 pm
Discutiendo con un amigo; la forma mas corta que se me ocurrio:
Código
  1. Public Function DecToRoman(ByVal lNum As Long) As String
  2.    DecToRoman = Choose(((lNum Mod 10) / 1) + 1, "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX")
  3.    lNum = lNum - (lNum Mod 10)
  4.    DecToRoman = Choose(((lNum Mod 100) / 10) + 1, "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC") & DecToRoman
  5.    lNum = lNum - (lNum Mod 100)
  6.    DecToRoman = String$((lNum \ 1000), "M") & Choose(((lNum Mod 1000) / 100) + 1, "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM") & DecToRoman
  7. End Function

Saludos ;)


Título: Re: [SNIPPET] Decimal a Romano
Publicado por: agus0 en 17 Diciembre 2010, 01:34 am
✗ Gracias ✗


Título: Re: [SNIPPET] Decimal a Romano
Publicado por: Psyke1 en 17 Diciembre 2010, 02:24 am
Buena Karcrack, esta muy claro de entender. :)
No te gusta más así?
Código
  1. Public Function DecToRoman(ByVal lNum As Long) As String
  2.    DecToRoman = Choose(((lNum Mod 10) / 1) + 1, "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX")
  3.    lNum = lNum - (lNum Mod 10)
  4.    If lNum Then
  5.        DecToRoman = Choose(((lNum Mod 100) / 10) + 1, "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC") & DecToRoman
  6.        lNum = lNum - (lNum Mod 100)
  7.        If lNum Then
  8.            DecToRoman = String$((lNum \ 1000), "M") & Choose(((lNum Mod 1000) / 100) + 1, "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM") & DecToRoman
  9.        End If
  10.    End If
  11. End Function
De esta manera si es el 7 o el 46 (por ej) no sigue comprobando.
Por cierto y RomanToDec() que? :silbar: :laugh:

DoEvents! :P


Título: Re: [SNIPPET] Decimal a Romano
Publicado por: Karcrack en 17 Diciembre 2010, 10:54 am
Lo importante es hacerlo corto, no rapido ni nada similar :P En cuanto a RomanToDec... no tiene utilidad :silbar: :xD


Título: Re: [SNIPPET] Decimal a Romano
Publicado por: 79137913 en 17 Diciembre 2010, 14:41 pm
HOLA!!!

Aunque no tenga utilidad, seguro alguien lo va a buscar y va a revivir el post asi que:

RomanToDecimal:

Código
  1. Private Function RomanToDecimal(RomNum As String) As String
  2.  
  3.    Dim VectorRom()         As Integer 'Lo lleno con los valores de las letras
  4.    Dim Tam                 As Integer 'Tamaño del numero Romano
  5.    Dim X                   As Integer 'Para los Bucles
  6.    Dim SumaRom             As Integer 'Acumulador
  7.  
  8.    Tam = Len(RomNum)
  9.  
  10.    If Tam = 0 Then
  11.        RomanToDecimal = 0
  12.        Exit Function
  13.    End If
  14.  
  15.    ReDim VectorRom(1 To Tam)
  16.  
  17.    For X = 1 To Tam
  18.        Select Case Mid$(RomNum, X, 1)
  19.            Case "M":   VectorRom(X) = 1000
  20.            Case "D":   VectorRom(X) = 500
  21.            Case "C":   VectorRom(X) = 100
  22.            Case "L":   VectorRom(X) = 50
  23.            Case "X":   VectorRom(X) = 10
  24.            Case "V":   VectorRom(X) = 5
  25.            Case "I":   VectorRom(X) = 1
  26.        End Select
  27.    Next
  28.  
  29.    For X = 1 To Tam
  30.        If X = Tam Then
  31.            SumaRom = SumaRom + VectorRom(X)
  32.        Else
  33.            If VectorRom(X) >= VectorRom(X + 1) Then
  34.                SumaRom = SumaRom + VectorRom(X)
  35.            Else
  36.                SumaRom = SumaRom - VectorRom(X)
  37.            End If
  38.        End If
  39.    Next
  40.  
  41.    RomanToDecimal = CStr(SumaRom)
  42.  
  43. End Function
  44.  

GRACIAS POR LEER!!!