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;
  }
}


18 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
  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
  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
  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