Conversión de números decimales entre 1 y 3999 a números romanos

Conversión de números decimales entre 1 y 3999 a números romanos
Pruébalo en GfG Practice

Dado un número entero, conviértalo a su representación equivalente en números romanos.

Nota: A continuación se muestra la lista de símbolos romanos (incluidos los casos sustractivos):

Símbolo Valor
I 1
IV 4
V 5
IX 9
incógnita 10
SG 40
l 50
XC 90
do 100
CD 400
D 500
CENTÍMETRO 900
METRO 1000

Ejemplos: 

Aporte: 9
Producción: IX
Explicación: 9 se escribe como 'IX' en números romanos usando notación sustractiva, colocando un número más pequeño antes de uno más grande.

  • I = 1 X = 10
  • IX significa 10 - 1 = 9

Aporte: 40
Producción: SG
Explicación: 40 se escribe como 'XL' en números romanos usando notación sustractiva, colocando un número más pequeño antes de uno más grande.

  • X = 10 litros = 50
  • XL significa 50 - 10 = 40

[Solución de propósito general] - O(n) Tiempo y O(n) Espacio

Compare el número dado con los valores base en el orden 1000 900 500 400 100 90 50 40 10 9 5 4 1. Una vez que encontramos el valor base más grande que es menor que el número dado, dividimos el número con el valor base y repetimos el proceso para valores base y cocientes más pequeños. Al resultado le sumamos el símbolo romano correspondiente al valor base encontrado un número de veces igual al cociente y repetimos el proceso para el resto.

Entendamos el enfoque con un ejemplo 3549

Iteración 1

  • Desde 3549 >= 1000 ; El valor base más grande será 1000 inicialmente.
  • Divida 3549/1000. Cociente = 3 res = 'MMM' (La nota M pertenece al 1000)
  • Resto = 549

Iteración 2

  • 1000 > 549 >= 500 ; El valor base más grande será 500.
  • Divida 549/500. Siempre = 1 .res = '300'
  • Resto = 49

Iteración 3

  • 50 > 49 >= 40 ; El valor base más grande es 40.
  • Divida 49/40. Cociente = 1 res = 'MMMDXL'
  • Resto = 9.

Iteración 4

  • El número 9 está presente en la lista. res = 'MMMDXL'
  • Resto = 0.
C++
   #include          using     namespace     std  ;   // Function to convert decimal to Roman Numerals   string     toRoman  (  int     x  )     {      // array of values and symbols      vector   <  int  >     base     =     {  1       4       5       9       10       40       50       90       100       400       500       900       1000  };      vector   <  string  >     sym     =     {  'I'       'IV'       'V'       'IX'       'X'       'XL'       'L'       'XC'       'C'       'CD'       'D'       'CM'       'M'  };      // to store result      string     res     =     ''  ;      // Loop from the right side to find      // the largest smaller base value      int     i     =     base  .  size  ()     -     1  ;      while     (  x     >     0  )     {      int     div     =     x     /     base  [  i  ];      while     (  div  )     {      res     +=     sym  [  i  ];      div  --  ;      }          // Repeat the process for remainder      x     =     x     %     base  [  i  ];          i  --  ;      }      return     res  ;   }   int     main  ()     {      int     x     =     3549  ;      cout      < <     toRoman  (  x  );      return     0  ;   }   
Java
   // Function to convert decimal to Roman Numerals   public     class   RomanConverter     {      public     static     String     toRoman  (  int     x  )     {          // array of values and symbols      int  []     base     =     {  1       4       5       9       10       40       50       90       100       400       500       900       1000  };      String  []     sym     =     {  'I'       'IV'       'V'       'IX'       'X'       'XL'       'L'       'XC'       'C'       'CD'       'D'       'CM'       'M'  };      // to store result      StringBuilder     res     =     new     StringBuilder  ();      // Loop from the right side to find      // the largest smaller base value      int     i     =     base  .  length     -     1  ;      while     (  x     >     0  )     {      int     div     =     x     /     base  [  i  ]  ;      while     (  div     >     0  )     {      res  .  append  (  sym  [  i  ]  );      div  --  ;      }          // Repeat the process for remainder      x     =     x     %     base  [  i  ]  ;      i  --  ;      }      return     res  .  toString  ();      }      public     static     void     main  (  String  []     args  )     {      int     x     =     3549  ;      System  .  out  .  println  (  toRoman  (  x  ));      }   }   
Python
   # Function to convert decimal to Roman Numerals   def   to_roman  (  x  ):   # array of values and symbols   base   =   [  1     4     5     9     10     40     50     90     100     400     500     900     1000  ]   sym   =   [  'I'     'IV'     'V'     'IX'     'X'     'XL'     'L'     'XC'     'C'     'CD'     'D'     'CM'     'M'  ]   # to store result   res   =   ''   # Loop from the right side to find   # the largest smaller base value   i   =   len  (  base  )   -   1   while   x   >   0  :   div   =   x   //   base  [  i  ]   while   div  :   res   +=   sym  [  i  ]   div   -=   1   # Repeat the process for remainder   x   %=   base  [  i  ]   i   -=   1   return   res   x   =   3549   print  (  to_roman  (  x  ))   
C#
   // Function to convert decimal to Roman Numerals   public     class     RomanConverter     {      public     static     string     ToRoman  (  int     x  )     {          // array of values and symbols      int  []     baseValues     =     {  1       4       5       9       10       40       50       90       100       400       500       900       1000  };      string  []     symbols     =     {  'I'       'IV'       'V'       'IX'       'X'       'XL'       'L'       'XC'       'C'       'CD'       'D'       'CM'       'M'  };      // to store result      string     res     =     ''  ;      // Loop from the right side to find      // the largest smaller base value      int     i     =     baseValues  .  Length     -     1  ;      while     (  x     >     0  )     {      int     div     =     x     /     baseValues  [  i  ];      while     (  div     >     0  )     {      res     +=     symbols  [  i  ];      div  --  ;      }          // Repeat the process for remainder      x     %=     baseValues  [  i  ];      i  --  ;      }      return     res  ;      }      public     static     void     Main  ()     {      int     x     =     3549  ;      Console  .  WriteLine  (  ToRoman  (  x  ));      }   }   
JavaScript
   // Function to convert decimal to Roman Numerals   function     toRoman  (  x  )     {          // array of values and symbols      const     base     =     [  1       4       5       9       10       40       50       90       100       400       500       900       1000  ];      const     sym     =     [  'I'       'IV'       'V'       'IX'       'X'       'XL'       'L'       'XC'       'C'       'CD'       'D'       'CM'       'M'  ];      // to store result      let     res     =     ''  ;      // Loop from the right side to find      // the largest smaller base value      let     i     =     base  .  length     -     1  ;      while     (  x     >     0  )     {      let     div     =     Math  .  floor  (  x     /     base  [  i  ]);      while     (  div  )     {      res     +=     sym  [  i  ];      div  --  ;      }          // Repeat the process for remainder      x     %=     base  [  i  ];      i  --  ;      }      return     res  ;   }   let     x     =     3549  ;   console  .  log  (  toRoman  (  x  ));   

Producción
MMMDXLIX 

Complejidad del tiempo: O(n) donde n es la longitud de la cadena de respuesta que almacena la conversión.
Espacio Auxiliar: En)

[Para rango limitado] - O(n) Tiempo y O(n) Espacio

La idea se basa en el hecho de que tenemos un rango limitado para convertir de 0 a 3999. Aislamos los dígitos correspondientes a los lugares de mil centenas, decenas y unidades y luego asignamos cada dígito a su respectivo equivalente en número romano en función de su valor posicional.

  • Almacenar asignaciones del carácter M para diferentes cocientes 0 1 2 3
  • Almacene asignaciones de C L e I para diferentes cocientes del 0 al 9.

Usando las asignaciones anteriores generamos directamente la cadena de resultado.

C++
   #include          using     namespace     std  ;   // Function to convert decimal to Roman Numerals   string     toRoman  (  int     val  )     {         // storing roman values of digits from 0-9      // when placed at different places      vector   <  string  >     m     =     {  ''       'M'       'MM'       'MMM'  };      vector   <  string  >     c     =     {  ''       'C'       'CC'       'CCC'       'CD'        'D'       'DC'       'DCC'       'DCCC'       'CM'  };      vector   <  string  >     x     =     {  ''       'X'       'XX'       'XXX'       'XL'        'L'       'LX'       'LXX'       'LXXX'       'XC'  };      vector   <  string  >     i     =     {  ''       'I'       'II'       'III'       'IV'        'V'       'VI'       'VII'       'VIII'       'IX'  };      // Converting to roman      string     thousands     =     m  [  val     /     1000  ];      string     hundreds     =     c  [(  val     %     1000  )     /     100  ];      string     tens     =     x  [(  val     %     100  )     /     10  ];      string     ones     =     i  [  val     %     10  ];      string     ans     =     thousands     +     hundreds     +     tens     +     ones  ;      return     ans  ;   }   int     main  ()     {      int     val     =     3549  ;      cout      < <     toRoman  (  val  );      return     0  ;   }   
Java
   import     java.util.*  ;   public     class   GfG     {      // Function to convert decimal to Roman Numerals      public     static     String     toRoman  (  int     val  )     {         // storing roman values of digits from 0-9      // when placed at different places      String  []     m     =     {  ''       'M'       'MM'       'MMM'  };      String  []     c     =     {  ''       'C'       'CC'       'CCC'       'CD'        'D'       'DC'       'DCC'       'DCCC'       'CM'  };      String  []     x     =     {  ''       'X'       'XX'       'XXX'       'XL'        'L'       'LX'       'LXX'       'LXXX'       'XC'  };      String  []     i     =     {  ''       'I'       'II'       'III'       'IV'        'V'       'VI'       'VII'       'VIII'       'IX'  };      // Converting to roman      String     thousands     =     m  [  val     /     1000  ]  ;      String     hundreds     =     c  [  (  val     %     1000  )     /     100  ]  ;      String     tens     =     x  [  (  val     %     100  )     /     10  ]  ;      String     ones     =     i  [  val     %     10  ]  ;      String     ans     =     thousands     +     hundreds     +     tens     +     ones  ;      return     ans  ;      }      public     static     void     main  (  String  []     args  )     {      int     val     =     3549  ;      System  .  out  .  println  (  toRoman  (  val  ));      }   }   
Python
   # Function to convert decimal to Roman Numerals   def   toRoman  (  val  ):   # storing roman values of digits from 0-9   # when placed at different places   m   =   [  ''     'M'     'MM'     'MMM'  ]   c   =   [  ''     'C'     'CC'     'CCC'     'CD'     'D'     'DC'     'DCC'     'DCCC'     'CM'  ]   x   =   [  ''     'X'     'XX'     'XXX'     'XL'     'L'     'LX'     'LXX'     'LXXX'     'XC'  ]   i   =   [  ''     'I'     'II'     'III'     'IV'     'V'     'VI'     'VII'     'VIII'     'IX'  ]   # Converting to roman   thousands   =   m  [  val   //   1000  ]   hundreds   =   c  [(  val   %   1000  )   //   100  ]   tens   =   x  [(  val   %   100  )   //   10  ]   ones   =   i  [  val   %   10  ]   ans   =   thousands   +   hundreds   +   tens   +   ones   return   ans   if   __name__   ==   '__main__'  :   val   =   3549   print  (  toRoman  (  val  ))   
C#
   using     System  ;   public     class     GfG     {      // Function to convert decimal to Roman Numerals      public     static     string     toRoman  (  int     val  )     {         // storing roman values of digits from 0-9      // when placed at different places      string  []     m     =     {  ''       'M'       'MM'       'MMM'  };      string  []     c     =     {  ''       'C'       'CC'       'CCC'       'CD'        'D'       'DC'       'DCC'       'DCCC'       'CM'  };      string  []     x     =     {  ''       'X'       'XX'       'XXX'       'XL'        'L'       'LX'       'LXX'       'LXXX'       'XC'  };      string  []     i     =     {  ''       'I'       'II'       'III'       'IV'        'V'       'VI'       'VII'       'VIII'       'IX'  };      // Converting to roman      string     thousands     =     m  [  val     /     1000  ];      string     hundreds     =     c  [(  val     %     1000  )     /     100  ];      string     tens     =     x  [(  val     %     100  )     /     10  ];      string     ones     =     i  [  val     %     10  ];      string     ans     =     thousands     +     hundreds     +     tens     +     ones  ;      return     ans  ;      }      public     static     void     Main  (  string  []     args  )     {      int     val     =     3549  ;      Console  .  WriteLine  (  toRoman  (  val  ));      }   }   
JavaScript
   // Function to convert decimal to Roman Numerals   function     toRoman  (  val  )     {         // storing roman values of digits from 0-9      // when placed at different places      let     m     =     [  ''       'M'       'MM'       'MMM'  ];      let     c     =     [  ''       'C'       'CC'       'CCC'       'CD'        'D'       'DC'       'DCC'       'DCCC'       'CM'  ];      let     x     =     [  ''       'X'       'XX'       'XXX'       'XL'        'L'       'LX'       'LXX'       'LXXX'       'XC'  ];      let     i     =     [  ''       'I'       'II'       'III'       'IV'        'V'       'VI'       'VII'       'VIII'       'IX'  ];      // Converting to roman      let     thousands     =     m  [  Math  .  floor  (  val     /     1000  )];      let     hundreds     =     c  [  Math  .  floor  ((  val     %     1000  )     /     100  )];      let     tens     =     x  [  Math  .  floor  ((  val     %     100  )     /     10  )];      let     ones     =     i  [  val     %     10  ];      let     ans     =     thousands     +     hundreds     +     tens     +     ones  ;      return     ans  ;   }   let     val     =     3549  ;   console  .  log  (  toRoman  (  val  ));   

Producción
MMMDXLIX