Código
#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; }
ITI