Convertir a números romanos en Java

Programa Java para convertir un número entero a números romanos.
El programa pide un número entre 1 y 3999 y calcula su equivalente en números romanos. Se utiliza un método llamado convertirANumerosRomanos que recibe el número N a convertir de tipo int y devuelve un String con el equivalente en números romanos.
Para convertirlo se obtiene por separado cada cifra del número y se muestran las combinaciones de letras del número romano equivalentes a cada cifra del número original. Este método no utiliza arrays de modo que este programa se puede resolver sin haber estudiado aún los arrays.
//Programa Java que lee un número y lo convierte a números romanos
import java.util.Scanner;

public class NumerosRomanos {

  public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int N;
      do {
             System.out.print("Introduce un número entre 1 y 3999: ");
             N = sc.nextInt();
      } while (N < 1 || N > 3999);
      System.out.println(N + " en numeros romanos -> " + convertirANumerosRomanos(N));                            
  }

  //método para pasar a números romanos
  public static String convertirANumerosRomanos(int numero) {
      int i, miles, centenas, decenas, unidades;
      String romano = "";
      
      //obtenemos cada cifra del número
      miles = numero / 1000;
      centenas = numero / 100 % 10;
      decenas = numero / 10 % 10;
      unidades = numero % 10;

      //millar
      for (i = 1; i <= miles; i++) {
             romano = romano + "M";
      }

      //centenas
      if (centenas == 9) {
          romano = romano + "CM";
      } else if (centenas >= 5) {
                 romano = romano + "D";
                 for (i = 6; i <= centenas; i++) {
                      romano = romano + "C";
                 }
      } else if (centenas == 4) {
                 romano = romano + "CD";
      } else {
                 for (i = 1; i <= centenas; i++) {
                      romano = romano + "C";
             }
      }

      //decenas
      if (decenas == 9) {
          romano = romano + "XC";
      } else if (decenas >= 5) {
                 romano = romano + "L";
                 for (i = 6; i <= decenas; i++) {
                      romano = romano + "X";
                 }
      } else if (decenas == 4) {
                 romano = romano + "XL";
      } else {
                 for (i = 1; i <= decenas; i++) {
                      romano = romano + "X";
                 }
      }

      //unidades
      if (unidades == 9) {
          romano = romano + "IX";
      } else if (unidades >= 5) {
                 romano = romano + "V";
                 for (i = 6; i <= unidades; i++) {                                                           
                      romano = romano + "I";
                 }
      } else if (unidades == 4) {
                 romano = romano + "IV";
      } else {
                 for (i = 1; i <= unidades; i++) {
                      romano = romano + "I";
                 }
      }
      return romano;
  }
}

31 comentarios:

  1. esta mal al convertir 3999 arroja MMMCMXLIX xq el correcto seria MMMCMXCIX

    ResponderEliminar
    Respuestas
    1. import java.util.*;

      public class Romanos {

      static Scanner sca = new Scanner(System.in);

      public static void main(String[] args) {
      AR();
      }

      static public void AR() {

      String un = "", de = "", ce = "", mi = "";
      int u, d, c, m, num;

      System.out.print("Ingrese numero en Arabigo: ");
      num = sca.nextInt();

      m = num / 1000;
      c = (num % 1000) / 100;
      d = ((num % 1000) % 100) / 10;
      u = (((num % 1000) % 100) % 10);

      switch (m) {
      case 1:
      mi += "M";
      break;
      case 2:
      mi += "MM";
      break;
      case 3:
      mi += "MMM";
      break;
      }

      switch (c) {
      case 1:
      ce += "C";
      break;
      case 2:
      ce += "CC";
      break;
      case 3:
      ce += "CCC";
      break;
      case 4:
      ce += "CD";
      break;
      case 5:
      ce += "D";
      break;
      case 6:
      ce += "DC";
      break;
      case 7:
      ce += "DCC";
      break;
      case 8:
      ce += "DCCC";
      break;
      case 9:
      ce += "CM";
      break;
      }

      switch (d) {
      case 1:
      de += "X";
      break;
      case 2:
      de += "XX";
      break;
      case 3:
      de += "XXX";
      break;
      case 4:
      de += "XL";
      break;
      case 5:
      de += "L";
      break;
      case 6:
      de += "LX";
      break;
      case 7:
      de += "LXX";
      break;
      case 8:
      de += "LXXX";
      break;
      case 9:
      de += "XC";
      break;
      }

      switch (u) {
      case 1:
      un += "I";
      break;
      case 2:
      un += "II";
      break;
      case 3:
      un += "III";
      break;
      case 4:
      un += "IV";
      break;
      case 5:
      un += "V";
      break;
      case 6:
      un += "VI";
      break;
      case 7:
      un += "VII";
      break;
      case 8:
      un += "VIII";
      break;
      case 9:
      un += "IX";
      break;
      }

      System.out.println("Su numero " + num + " en romano es: " + mi + ce + de + un);

      }
      }

      Asi estaria mejor con switch saludos

      Eliminar
    2. import java.util.*;

      public class Romanos {

      static Scanner sca = new Scanner(System.in);

      public static void main(String[] args) {
      AR();
      }

      static public void AR() {

      String un = "", de = "", ce = "", mi = "";
      int u, d, c, m, num;

      System.out.print("Ingrese numero en Arabigo: ");
      num = sca.nextInt();

      m = num / 1000;
      c = (num % 1000) / 100;
      d = ((num % 1000) % 100) / 10;
      u = (((num % 1000) % 100) % 10);

      switch (m) {
      case 1:
      mi += "M";
      break;
      case 2:
      mi += "MM";
      break;
      case 3:
      mi += "MMM";
      break;
      }

      switch (c) {
      case 1:
      ce += "C";
      break;
      case 2:
      ce += "CC";
      break;
      case 3:
      ce += "CCC";
      break;
      case 4:
      ce += "CD";
      break;
      case 5:
      ce += "D";
      break;
      case 6:
      ce += "DC";
      break;
      case 7:
      ce += "DCC";
      break;
      case 8:
      ce += "DCCC";
      break;
      case 9:
      ce += "CM";
      break;
      }

      switch (d) {
      case 1:
      de += "X";
      break;
      case 2:
      de += "XX";
      break;
      case 3:
      de += "XXX";
      break;
      case 4:
      de += "XL";
      break;
      case 5:
      de += "L";
      break;
      case 6:
      de += "LX";
      break;
      case 7:
      de += "LXX";
      break;
      case 8:
      de += "LXXX";
      break;
      case 9:
      de += "XC";
      break;
      }

      switch (u) {
      case 1:
      un += "I";
      break;
      case 2:
      un += "II";
      break;
      case 3:
      un += "III";
      break;
      case 4:
      un += "IV";
      break;
      case 5:
      un += "V";
      break;
      case 6:
      un += "VI";
      break;
      case 7:
      un += "VII";
      break;
      case 8:
      un += "VIII";
      break;
      case 9:
      un += "IX";
      break;
      }

      System.out.println("Su numero " + num + " en romano es: " + mi + ce + de + un);

      }
      }

      Asi estaria mejor con switch saludos

      Eliminar
    3. public void mostrarOnce(){
      String opcion;
      do{
      System.out.print("Introduce numero del 1 al 5000 para convertirlo en romano: ");
      int numero = input.nextInt();


      if (numero>1 && numero<5000){

      int w = numero/1000; //Millar
      int aux2= numero/100;
      int x= aux2%10;//Centena
      int aux = numero%100;
      int y=aux/10; //Decima
      int z=numero%10; //Unidad


      //Millar
      if (w>0 && w<4) {
      for(int i=1;i<=w;i++){
      System.out.print('M');
      }
      }else if (w==4){
      System.out.print("IVm");
      }else if(w==5){
      System.out.print("Vm");
      }

      //Centena
      if (x>0 && x<4){
      for(int i=1;i<=x;i++){
      System.out.print("C");
      }
      }else if (x==4){
      System.out.print("CD");
      }else if (x>=5 && x<6){
      System.out.print("D");
      }else if(x>=6 && x<9){
      System.out.print("D");
      for(int i=6;i<=x;i++){
      System.out.print("C");
      }
      }else if(x==9){
      System.out.print("CM");
      }

      //decima
      if (y>0 && y<4){
      for(int i = 1;i<=y;i++){
      System.out.print("X");
      }
      }else if(y==4){
      System.out.print("XL");
      }else if(y>=5 && y<9){
      System.out.print("L");
      for(int j=6; j<=y; j++){
      System.out.print("X");
      }
      }else if(y==9){
      System.out.print("XC");
      }

      //unidad
      if (z>0 && z<4){
      for (int i=1;i<=z;i++){
      System.out.print("I");
      }
      }else if (z==4){
      System.out.print("IV");
      }else if (z>=5 && z<9){
      int tem= z%5;
      System.out.print("V");
      for(int i=1;i<=tem;i++){
      System.out.print("I");
      }
      }else if (z==9){
      System.out.print("IX");
      }
      }
      System.out.println("\n Quiere ingresar otro numero? S/N");
      opcion = input.next();
      }while("S".equals(opcion));
      }
      }

      Eliminar
    4. que hago si me sale error en input?

      Eliminar
  2. SOLO CAMBIEN EL XL Y PONGAN XC
    //decenas
    if (decenas == 9) {
    romano = romano + "XC";
    } else if (decenas >= 5) {
    romano = romano + "L";

    ResponderEliminar
    Respuestas
    1. Gracias Jaime por avisar del error. Ya está corregido. Saludos

      Eliminar
    2. ¿Cómo es que la variable número toma el valor de N ?... alguien responde por favor?
      Mil gracias de antemano!
      Estoy aprendiendo :3

      Eliminar
  3. Muy buen post, muy interesante y muy útil la información, se valora mucho los aportes y el tiempo dedicado para realizar los mismos! Pulgar arriba ! Te esperamos por nuestro blog !

    ResponderEliminar
  4. ¿Cómo es que la variable número toma el valor de N ?... alguien responde por favor?
    Mil gracias de antemano!
    Estoy aprendiendo :3

    ResponderEliminar
    Respuestas
    1. System.out.println(N + " en numeros romanos -> " + convertirANumerosRomanos(N));

      porque al llamar a la función , en esta parte **(N)** pones el nombre de la variable que quieres, en este caso la que se escaneo

      Eliminar
  5. Eh estado leyendo un poco de objetos y métodos y ya resolvieron mi duda.
    Gracias de todos modos.
    Slds!

    ResponderEliminar
  6. Si yo quiero que el programa lea 10 números donde debo colocar el ciclo para ? Por favor y muchas gracias

    ResponderEliminar
  7. es mas facil asi no?

    public class Romanos3Cifras {

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {

    String valor;
    valor = JOptionPane.showInputDialog(null, "Ingrese un numero del 1 al 999");
    String unidades, decenas, centenas;
    int numero;
    numero = Integer.parseInt(valor);

    //unidades
    int residuo = numero % 10;

    //decenas
    int numerodecena = numero / 10;
    int residuo2 = numerodecena % 10;

    //centenas
    int numerocentena = numero / 100;
    int residuo3 = numerocentena % 10;




    switch(residuo) //unidades
    {
    case 1: unidades = "I";
    break;
    case 2: unidades = "II";
    break;
    case 3: unidades = "III";
    break;
    case 4: unidades = "IV";
    break;
    case 5: unidades = "V";
    break;
    case 6: unidades = "VI";
    break;
    case 7: unidades = "VII";
    break;
    case 8: unidades = "VIII";
    break;
    case 9: unidades = "IX";
    break;
    default: unidades = "";
    break;
    }


    switch(residuo2) //decenas
    {
    case 1: decenas = "X";
    break;
    case 2: decenas = "XX";
    break;
    case 3: decenas = "XXX";
    break;
    case 4: decenas = "XL";
    break;
    case 5: decenas = "L";
    break;
    case 6: decenas = "LX";
    break;
    case 7: decenas = "LXX";
    break;
    case 8: decenas = "LXXX";
    break;
    case 9: decenas = "XC";
    break;
    default: decenas = "";
    break;
    }


    switch(residuo3) //centenas
    {
    case 1: centenas = "C";
    break;
    case 2: centenas = "CC";
    break;
    case 3: centenas = "CCC";
    break;
    case 4: centenas = "CD";
    break;
    case 5: centenas = "D";
    break;
    case 6: centenas = "DC";
    break;
    case 7: centenas = "DCC";
    break;
    case 8: centenas = "DCCC";
    break;
    case 9: centenas = "CM";
    break;
    default: centenas = "";
    break;
    }


    JOptionPane.showMessageDialog(null, "El equivalente en numero romano es:" + centenas + decenas + unidades);
    }


    }

    ResponderEliminar
    Respuestas
    1. solo llegue a centenas. si quieren ponerle mas es solo seguir de lo mismo

      Eliminar
  8. hola, tu programa está bastante bien pero tiene un pequeño error, si tu por ejemplo escribes el número 111 como número romano te aparece "CI" o por ejemplo si escribes 2016 te aparece "MMVI"

    saludos

    ResponderEliminar
  9. perdón amigo, el error fue mío, no puse bien el código

    saludos

    ResponderEliminar
  10. disculpen y para hacer el método al revez que no solo convierta de arábigo a romano

    ResponderEliminar
  11. disculpen y para hacer el método al revez que no solo convierta de arábigo a romano

    ResponderEliminar
    Respuestas
    1. import java.util.Scanner;
      import java.util.regex.Matcher;
      import java.util.regex.Pattern;

      public class NumerosRomanos {
      // Este caso cae en excepciones como por ejejmplo no validar una cantidad de
      // de veces que podemos recibir una literal

      public void Principal() throws Exception {
      System.out.print("Ingrese el número Romano que desea convertir: ");
      Scanner stdIn = new Scanner(System.in);
      String secuens =stdIn.nextLine();

      Pattern pat = Pattern.compile("[IVXLCDM]+");
      Matcher mat = pat.matcher(secuens);

      if (mat.matches()) {

      String secuencia = " " + secuens;
      int n = secuencia.length();
      int s = 0;


      for (int i = 0; i < n;i++){

      if (secuencia.charAt(i) == 'M'){
      s = s+1000;
      if (secuencia.charAt(i-1) == 'C'){
      s = s-200;
      }
      }
      if (secuencia.charAt(i) == 'D'){
      s = s+500;
      if (secuencia.charAt(i-1) == 'C'){
      s = s-200;
      }
      }
      if (secuencia.charAt(i) == 'C'){
      s = s+100;
      if (secuencia.charAt(i-1) == 'X'){
      s = s-20;
      }
      }
      if (secuencia.charAt(i) == 'L'){
      s = s+50;
      if (secuencia.charAt(i-1) == 'X'){
      s = s-20;
      }
      }
      if (secuencia.charAt(i) == 'X'){
      s = s+10;
      if (secuencia.charAt(i-1) == 'I'){
      s = s-2;
      }
      }
      if (secuencia.charAt(i) == 'V'){
      s = s+5;
      if (secuencia.charAt(i-1) == 'I'){
      s = s-2;
      }
      }
      if (secuencia.charAt(i) == 'I'){
      s = s+1;
      }

      }

      System.out.println(secuencia + " (" + s+ ")");

      } else {
      throw new Exception("e");

      }


      }

      public static void main(String[] args) {

      while(true){
      try{
      NumerosRomanos num = new NumerosRomanos();
      num.Principal();
      break;

      }catch (Exception e){
      System.out.println("Error: solo se permiten IVXLCDM ");
      }
      }
      }
      }

      Eliminar
  12. HOLA
    me podrían ayudar con este ejercicio
    Una librería tiene dos tipos de clientes: Estudiantes (E) y público en general (P). Además
    Ofrece dos tipos de pago: Contado (C) y Plazos (P), se pide escribir un algoritmo que
    Pida el ingreso de: el tipo de cliente, la forma de pago y el monto de pago. Dependiendo
    Del pago va a existir un descuento o un recargo tal como se muestra a continuación:

    Tipo Contado(C) Descuento Plazos (P) Recargo
    Estudiante 20% 15%
    Publico G. 10% 25%

    gracias.......

    ResponderEliminar
  13. Y si quiero Ingresar un numero entero entre 0 y 3999, y me lo devuelva el numero en romano?
    Alguien me ayuda?

    ResponderEliminar
  14. Aquí mi solución. Saludos!

    import java.util.Scanner;

    public class NumeroRomano {

    public static void main(String[] args) {

    int num=0, un=0, de=0, ce=0, mi=0;
    String rom="";

    Scanner sc=new Scanner(System.in);

    do{
    System.out.print("Ingrese numero: ");
    num=sc.nextInt();
    }while(num<=0 || num>=4000);

    //Millar
    mi=num/1000;
    num=num%1000;
    //Centena
    ce=num/100;
    num=num%100;
    //Decena
    de=num/10;
    num=num%10;
    //Unidad
    un=num/1;

    //1 al 9 en Romano
    switch (un) {
    case 1:
    rom="I";
    break;
    case 2:
    rom="II";
    break;
    case 3:
    rom="III";
    break;
    case 4:
    rom="IV";
    break;
    case 5:
    rom="V";
    break;
    case 6:
    rom="VI";
    break;
    case 7:
    rom="VII";
    break;
    case 8:
    rom="VIII";
    break;
    case 9:
    rom="IX";
    break;
    }

    //10 al 99 en Romano
    switch (de) {
    case 1:
    rom="X"+rom;
    break;
    case 2:
    rom="XX"+rom;
    break;
    case 3:
    rom="XXX"+rom;
    break;
    case 4:
    rom="XL"+rom;
    break;
    case 5:
    rom="L"+rom;
    break;
    case 6:
    rom="LX"+rom;
    break;
    case 7:
    rom="LXX"+rom;
    break;
    case 8:
    rom="LXXX"+rom;
    break;
    case 9:
    rom="XC"+rom;
    break;
    }

    //100 al 999 en Romano
    switch (ce) {
    case 1:
    rom="C"+rom;
    break;
    case 2:
    rom="CC"+rom;
    break;
    case 3:
    rom="CCC"+rom;
    break;
    case 4:
    rom="CD"+rom;
    break;
    case 5:
    rom="D"+rom;
    break;
    case 6:
    rom="DC"+rom;
    break;
    case 7:
    rom="DCC"+rom;
    break;
    case 8:
    rom="DCCC"+rom;
    break;
    case 9:
    rom="CM"+rom;
    break;
    }

    //1000 al 3999 en Romano
    switch (mi) {
    case 1:
    rom="M"+rom;
    break;
    case 2:
    rom="MM"+rom;
    break;
    case 3:
    rom="MMM"+rom;
    }

    System.out.println("Numero Romano: " + rom);
    }
    }

    ResponderEliminar
  15. Gracias a todos por sus aportes son de vital importancia para todo aquel que necesita ayuda. Saludos

    ResponderEliminar
  16. Hola buenas. Alguien me podria ayudar a como acer una calculadora de numeros romanos en java en el netbeans

    ResponderEliminar
  17. comparto mi código

    manden el número a convertir como String (texto)

    public class numerosRomanos{
    String retornar = "";

    public String convertir(String numeros) {
    int caracteres = numeros.length();
    int entero = Integer.parseInt(numeros);
    if(entero != 0 ){
    int num = Integer.parseInt(String.valueOf(numeros.charAt(0)));
    int multiplicar = (int)Math.pow(10, (caracteres - 1));
    retornar += romanos(num, (caracteres - 1));
    int restar = entero - (num * multiplicar);
    convertir(String.valueOf(restar));
    }
    return retornar;
    }

    public String romanos(int numero, int caracteres){
    String romano = "";
    String[][] lista = { {"I", "V"}, {"X", "L"}, {"C", "D"}, {"M"} };
    if(numero < 4){
    for (int i = 0; i < numero; i++) {
    romano += lista[caracteres][0];
    }
    } else if(numero == 4){
    romano = lista[caracteres][0] + lista[caracteres][1];
    } else if( numero > 4 && numero < 9){
    romano = lista[caracteres][1];
    for (int i = 0; i < (numero - 5); i++) {
    romano += lista[caracteres][0];
    }
    } else if(numero == 9){
    romano = lista[caracteres][0] + lista[caracteres + 1][0];
    }
    return romano;
    }
    }

    ResponderEliminar
  18. Ayuda es en java
    Desarrolla un programa, para solicitar los números enteros: 1, 5, 10, 50, 100, 500 y 1000
    y que imprima su valor correspondiente en notación de números romanos.

    ResponderEliminar
  19. Hola me pueden ayudar a hacer un algoritmo que como dato de entrada yo ingresé un número entero y de salida me lo devuelva como romano pero que sobrepase 3.999 por ejemplo hata 10mil o algo así utilizando switch, case espero me puedan ayudar por favor

    ResponderEliminar
  20. pero a orientada a objetos ?


    ResponderEliminar