jomasero
6/26/2013 - 4:16 PM

[Falta probar este código] Convertir un número romano a un número arábigo.

[Falta probar este código] Convertir un número romano a un número arábigo.

using System;
using System.Collections.Generic;
using System.Text;

namespace Romanos
{
  class Program
  {
    static void Main(string[] args)
    {
      string [] Romanos = new string [] {"MDCCCXII", "XXI", "IX", "I", "DXIV"};
      foreach (string Número in Romanos)
        Console.WriteLine (Número + ": " + getArabigo (Número));
    }

    class Símbolo
    {
      public char Clave;
      public int Valor;
      public Símbolo Prefijo;
      
      public Símbolo (char Clave, int Valor, Símbolo Prefijo)
      {
        this.Clave = Clave;
        this.Valor = Valor;
        this.Prefijo = Prefijo;
      }
    }

    static Símbolo I = new Símbolo ('I', 1, null);
    static Símbolo V = new Símbolo ('V', 5, I);
    static Símbolo X = new Símbolo ('X', 10, I);
    static Símbolo L = new Símbolo ('L', 50, X);
    static Símbolo C = new Símbolo ('C', 100, X);
    static Símbolo D = new Símbolo ('D', 500, C);
    static Símbolo M = new Símbolo ('M', 1000, C);

    static Símbolo [] Símbolos = new Símbolo [] {I, V, X, L, C, D, M};

    static int getIndiceSímbolo (char Clave)
    {
      for (int i = 0; i < Símbolos.Length; ++i)
        if (Símbolos [i].Clave == Clave)
          return i;
      return -1;
    }

    static int getArabigo (string Romano)
    {
      int Resultado = 0;
      Símbolo Previo = null;
    
      for (int i = 0; i < Romano.Length; ++i)
      {
        Símbolo Actual = Símbolos [getIndiceSímbolo (Romano [i])];
        Resultado += Actual.Valor;
        if (Previo != null && Actual.Prefijo == Previo)
          Resultado -= 2 * Previo.Valor;
        Previo = Actual;
      }
      return Resultado;
    }
  }
}