Conversión de números romanos, en C++.

🤓 ¿Sabías que los romanos no siempre usaron las mismas reglas para escribir sus números y que éstas varían según la época? De acuerdo a las reglas modernas, esta expresión regular comprueba la validez de un número romano:

(^(?=[MDCLXVI])M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$)

▶️ Videos de C++

Ejercicio resuelto C++

Click aquí para una versión accesible de la infografía (apta para lectores electrónicos)
 

Dado un número romano, convertirlo a su equivalente en números arábigos en base decimal. Equivalencias: I=1, V=5, X=10, L=50, C=100, D=500, M=1000.

Reglas:

Número repetido hasta 3 veces: se suma.

  • I delante de V o X significa restar 1.
  • X delante de L o C significa restar 10.
  • C delante de D o M significa restar 100.
  • Precondiciones: el número romano a convertir estará en mayúsculas, será válido y su equivalente estará entre 1 y 3999.

Resolución:

int romanoAInt(string romano) {
    map<char, int> equivalencias;
    equivalencias['M'] = 1000;
    equivalencias['D'] = 500;
    equivalencias['C'] = 100;
    equivalencias['L'] = 50;
    equivalencias['X'] = 10;
    equivalencias['V'] = 5;
    equivalencias['I'] = 1;
    int respuesta = 0;
    for (int i = 0; i < romano.length() - 1; ++i)
    {
        if (equivalencias[romano[i]] < equivalencias[romano[i+1]])
            respuesta -= equivalencias[romano[i]];
        else
            respuesta += equivalencias[romano[i]];
    }
    respuesta += equivalencias[romano[romano.length()-1]];
    return respuesta;
}

💻 Código ejecutable