Convertendo números decimais entre 1 e 3999 em algarismos romanos

Convertendo números decimais entre 1 e 3999 em algarismos romanos
Experimente no GfG Practice

Dado um número inteiro, converta-o em sua representação numérica romana equivalente.

Observação: A seguir está a lista de símbolos romanos (incluindo casos subtrativos):

Símbolo Valor
EU 1
4 4
V 5
IX 9
X 10
XL 40
eu 50
XC 90
C 100
CD 400
D 500
CM 900
M 1000

Exemplos: 

Entrada: 9
Saída: IX
Explicação: 9 é escrito como 'IX' em algarismos romanos usando notação subtrativa - colocando um numeral menor antes de um maior.

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

Entrada: 40
Saída: XL
Explicação: 40 é escrito como 'XL' em algarismos romanos usando notação subtrativa - colocando um numeral menor antes de um maior.

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

[Solução de uso geral] - O(n) Tempo e O(n) Espaço

Compare o número fornecido com os valores base na ordem 1000 900 500 400 100 90 50 40 10 9 5 4 1. Assim que encontrarmos o maior valor base que é menor que o número fornecido, dividimos o número pelo valor base e repetimos o processo para valores base menores e quociente. Adicionamos o símbolo romano correspondente ao valor base encontrado ao resultado número de vezes igual ao quociente e repetimos o processo para o restante.

Vamos entender a abordagem com um exemplo 3549

Iteração 1

  • Desde 3549 >= 1000 ; o maior valor base será 1000 inicialmente.
  • Divida 3549/1000. Quociente = 3 res = 'MMM' (Nota M pertence a 1000)
  • Restante = 549

Iteração 2

  • 1000 > 549 >= 500 ; o maior valor base será 500.
  • Divida 549/500. Sempre que = 1 .res = '300'
  • Restante = 49

Iteração 3

  • 50 > 49 >= 40; o maior valor base é 40.
  • Divida 49/40. Quociente = 1 res = 'MMMDXL'
  • Restante = 9.

Iteração 4

  • O número 9 está presente na lista. res = 'MMMDXL'
  • Restante = 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  ));   

Saída
MMMDXLIX 

Complexidade de tempo: O(n) onde n é o comprimento da string de resposta que armazena a conversão.
Espaço Auxiliar: Sobre)

[Para intervalo limitado] - O(n) Tempo e O(n) Espaço

A ideia é baseada no fato de que temos um intervalo limitado para converter de 0 a 3999. Isolamos os dígitos correspondentes às casas de milhares, centenas, dezenas e unidades e, em seguida, mapeamos cada dígito para seu respectivo numeral romano equivalente com base em seu valor posicional.

  • Armazene mapeamentos do caractere M para diferentes quocientes 0 1 2 3
  • Armazene mapeamentos de C L e I para diferentes quocientes de 0 a 9.

Usando os mapeamentos acima, geramos diretamente a string 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  ));   

Saída
MMMDXLIX