Aproximación a solución recursiva: números romanos a números decimales

Esta tarde me vino una pequeña inspiración divina relacionada con una solución de programación a un problema muy común en las asignaturas de algoritmia de las carreras de informática: el de transformar números romanos en decimales.

El problema lo resolví en su momento de manera iterativa. Aunque hoy se me ha ocurrido una solución recursiva que, desde mi punto de vista, es más elegante.

Soy consciente de que no es lo más óptimo del mundo, y de que podemos ponerle cualquier cadena, sea correcta o no. Va a petar muchas veces. Aunque, con números bien formados, funciona. Para ser 20 minutos de trabajo no está nada mal, ¿no creéis? 🙂

Para compilarlo, copiad y pegar el bloque inferior en un archivo de texto, guardadlo con el nombre «romans.cpp» y compiladlo ejecutando g++ -oromans romans.cpp. Para ejecutarlo, ./romans CCCVIII (si es sistema Linux u OS X) o romans.exe CCCVIII (si es Windows).

Sin más, os dejo el código (C++). Haced con él lo que os dé la gana, pero tened en cuenta que va a estar indexado en Google: si lo copiáis, vuestros profesores se darán cuenta.

#include 
#include 
#include 

using namespace std;

int valorletra(char l) {
	int valorprimeraletra;
	switch(l) {
		case 'M': valorprimeraletra=1000; break;
		case 'D': valorprimeraletra=500; break;
		case 'C': valorprimeraletra=100; break;
		case 'L': valorprimeraletra=50; break;
		case 'X': valorprimeraletra=10; break;
		case 'V': valorprimeraletra=5; break;
		case 'I': valorprimeraletra=1; break;
		default: break;
	}
	return valorprimeraletra;
}

int romans(string _c, int longitud) {
	int resultado=0; // resultado que leerá
	char primeraletra=0;
	int i=0; // indice para leer la cadena
	bool grupodistinto=false;
	if (valorletra(_c[1])>valorletra(_c[0])) {
		resultado-=valorletra(_c[0]); 
		i++; 
	}
	primeraletra=_c[i];
	while (!grupodistinto) {
		if (_c[i]!=primeraletra) grupodistinto=true;
		else {
			resultado+=valorletra(_c[i]);
		}
		i++; 
	}
	i--;
	string subcadena=_c.substr(i,longitud-i);
	if (subcadena.length()>0) {
		resultado+=romans(subcadena, subcadena.length());
	}
	return resultado;
}

int main(int argc, char *argv[]) {
	string cadena=argv[1];
	cout << romans(cadena, cadena.length()) <
	

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.