jueves, 28 de junio de 2018

06. Números Romanos.

La numeración Romana emplea letras en lugar de números con unas reglas muy simples que son:
  1. Siempre se leen de izquierda a derecha.
  2. Los valores básicos son: I=1 V=5 X=10 L=50 C=100 D=500 M=1000
  3. Los números romanos I, X, C y M pueden repetirse hasta tres veces a la hora de escribir un número romano compuesto.
  4. Los números romanos V, L y D no pueden repetirse nunca.
  5. Si tienen un número a la derecha menor que el de la izquierda entonces se suman ambos. Ejemplo: VI: el número de la derecha (I = 1) es menor que el de la izquierda (V = 5) entonces se suman, es decir VI = 6.
  6. Se restarán en caso contrario Ejemplo: XL: el número de la derecha (L = 50) es mayor que el de la izquierda (X = 10), y además este es I luego se resta el de la izquierda al de la derecha, es decir XL=40

Según estas normas para convertir un número a su equivalente en romanos necesitamos descomponer ese número según sus unidades, decenas, centenas etc y escribir cada parte con su notación romana.
Es decir, 96 en números romanos podrá escribirse como 90 + 6 es decir, XCVI.
Mientras que el número 422 será 400 + 20 + 2 es decir, CDXXII.

Siguiendo esta lógica es necesario emplear "algo" que descomponga nuestro número en sus valores correspondientes y después lo anote siguiendo una correlación, si es un 1 entonces I, si es 2 entonces II, si es 10 entonces X, si es 20 entonces XX...

Se puede contruir un array para cada zona del número, dejando vacio el del cero.

        Dim Unidad() As String = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}
        Dim Decena() As String = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}
        Dim Centena() As String = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}


Ahora solamente nos queda el descomponer el número, lo haremos con la función FLOOR que nos da el mayor número que sea menor o igual que uno decimal dado.

    Sub Main()
        Dim N, u, d, c As Integer
        Dim Unidad() As String = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}
        Dim Decena() As String = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}
        Dim Centena() As String = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}
        N = Console.ReadLine
        u = N Mod 10
        d = Math.Floor(N / 10) Mod 10
        c = Math.Floor(N / 100)
        If (N >= 100) Then
            Console.WriteLine(Centena(c) + Decena(d) + Unidad(u))
        Else
            If (N >= 10) Then
                Console.WriteLine(Decena(d) + Unidad(u))
            Else
                Console.WriteLine(Unidad(N))
            End If
        End If
        Console.ReadLine()
    End Sub

No hay comentarios:

Publicar un comentario