Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 0xFer en 24 Mayo 2015, 19:00 pm



Título: [Aporte]Convertidor de números decimales a romanos
Publicado por: 0xFer en 24 Mayo 2015, 19:00 pm
el código es un simple algoritmo recursivo, el limite es de 3999 pero se puede extender haciendo unas modificaciones en el código, esto es así porque con las letras IVXLCDM solo se puede hasta ese valor

Código
  1. #include <stdio.h>
  2.  
  3. char* s = "IVXLCDM";
  4. int n[] = {1,5,10,50,100,500,1000};
  5.  
  6. int aC; //aC es el número a convertir
  7. #define NUM_LIMITE 4000 //aC tiene que ser menor a esta constante
  8.  
  9. void rec(int r){ //algoritmo recursivo, el valor de r lo explico con ejemplos:
  10.                 //si aC = 43 entonces r = 10, si aC = 232 entonces r = 100
  11.                 //si aC = 2132 entonces r = 1000, si aC = 4 entonces r = 1
  12.  
  13.    int b = aC/r; //Toma el digito más significativo de aC, ejemplo: si aC = 234 entonces b = 2
  14.    aC -= b*r;    //trunca aC restando el digito más significativo, si aC = 234 entonces aC = 34
  15.    int p = 0;  
  16.  
  17.    for(int i=0; i < 7;i++)
  18.    if(r==n[i]) p = i;   /*
  19.            p sirve para saber la posición del caracter más indicado para imprimir ejemplos:
  20. cuando r = 1 entonces p = 0 y s[p] = 'I'
  21.                        cuando r = 10 entonces p = 2 y s[p] = 'X'
  22. cuando r = 100 entonces p = 4 y s[p] = 'C'
  23. cuando r = 1000 entonces p = 6 y s[p] = 'M'
  24. */          
  25.  
  26.    //lo siguiente lo comento para r = 1 pero lo mismo pasa con diferentes valores de r
  27.  
  28.    if(b < 4){ //para I II II
  29.        for(int i=0; i < b;i++)
  30.           printf("%c",s[p]);   //s[p] = 'I' lo imprime b veces
  31.    }
  32.  
  33.    else if(b < 6){ //para IV and V
  34.   printf("%c%c",(b==4)?s[p]:' ',s[p+1]); // s[p] = 'I' y s[p+1] = 'V'
  35.    }
  36.  
  37.    else if(b < 9){ //para VI VII VIII
  38.  
  39.   printf("%c",s[p+1]); //s[p+1] = 'V'
  40.  
  41.   for(int i = b-5; i > 0;i--)
  42.       printf("%c",s[p]);      //s[p] = 'I' lo imprime b-5 veces
  43.    }
  44.  
  45.    else{ //para IX
  46. printf("%c%c",s[p],s[p+2]); //s[p] = 'I' y s[p+2] = 'X'
  47.    }
  48.  
  49.    printf(" ");  //esta linea es solo para que el resultado sea más legible :)  
  50.  
  51.    if(r!=1) rec(r/10); //cuando r = 1 entonces se ha evaluado el digito menos significativo de aC
  52.  
  53. }
  54.  
  55. int main(){
  56.  
  57.  printf("Ingresa el numero a convertir: ");
  58.  scanf("%i",&aC);
  59.  
  60.  if( aC < NUM_LIMITE )
  61.      for(int r = 10; ;r*=10)
  62.          if(aC < r){
  63.          rec(r/10);
  64.          break;
  65.      }
  66.  
  67.  getchar();
  68.  return 0;
  69. }
  70.  


ITI