#include <stdio.h>
char* s = "IVXLCDM";
int n[] = {1,5,10,50,100,500,1000};
int aC; //aC es el número a convertir
#define NUM_LIMITE 4000 //aC tiene que ser menor a esta constante
void rec(int r){ //algoritmo recursivo, el valor de r lo explico con ejemplos:
//si aC = 43 entonces r = 10, si aC = 232 entonces r = 100
//si aC = 2132 entonces r = 1000, si aC = 4 entonces r = 1
int b = aC/r; //Toma el digito más significativo de aC, ejemplo: si aC = 234 entonces b = 2
aC -= b*r; //trunca aC restando el digito más significativo, si aC = 234 entonces aC = 34
int p = 0;
for(int i=0; i < 7;i++)
if(r==n[i]) p = i; /*
p sirve para saber la posición del caracter más indicado para imprimir ejemplos:
cuando r = 1 entonces p = 0 y s[p] = 'I'
cuando r = 10 entonces p = 2 y s[p] = 'X'
cuando r = 100 entonces p = 4 y s[p] = 'C'
cuando r = 1000 entonces p = 6 y s[p] = 'M'
*/
//lo siguiente lo comento para r = 1 pero lo mismo pasa con diferentes valores de r
if(b < 4){ //para I II II
for(int i=0; i < b;i++)
printf("%c",s[p]); //s[p] = 'I' lo imprime b veces
}
else if(b < 6){ //para IV and V
printf("%c%c",(b==4)?s[p]:' ',s[p+1]); // s[p] = 'I' y s[p+1] = 'V'
}
else if(b < 9){ //para VI VII VIII
printf("%c",s[p+1]); //s[p+1] = 'V'
for(int i = b-5; i > 0;i--)
printf("%c",s[p]); //s[p] = 'I' lo imprime b-5 veces
}
else{ //para IX
printf("%c%c",s[p],s[p+2]); //s[p] = 'I' y s[p+2] = 'X'
}
printf(" "); //esta linea es solo para que el resultado sea más legible :)
if(r!=1) rec(r/10); //cuando r = 1 entonces se ha evaluado el digito menos significativo de aC
}
int main(){
printf("Ingresa el numero a convertir: ");
scanf("%i",&aC);
if( aC < NUM_LIMITE )
for(int r = 10; ;r*=10)
if(aC < r){
rec(r/10);
break;
}
getchar();
return 0;
}