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;
}
}
esta mal al convertir 3999 arroja MMMCMXLIX xq el correcto seria MMMCMXCIX
ResponderEliminarimport java.util.*;
Eliminarpublic 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
import java.util.*;
Eliminarpublic 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
public void mostrarOnce(){
EliminarString 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));
}
}
que hago si me sale error en input?
EliminarSOLO CAMBIEN EL XL Y PONGAN XC
ResponderEliminar//decenas
if (decenas == 9) {
romano = romano + "XC";
} else if (decenas >= 5) {
romano = romano + "L";
Gracias Jaime por avisar del error. Ya está corregido. Saludos
Eliminar¿Cómo es que la variable número toma el valor de N ?... alguien responde por favor?
EliminarMil gracias de antemano!
Estoy aprendiendo :3
fgfgf
EliminarMuy 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¿Cómo es que la variable número toma el valor de N ?... alguien responde por favor?
ResponderEliminarMil gracias de antemano!
Estoy aprendiendo :3
System.out.println(N + " en numeros romanos -> " + convertirANumerosRomanos(N));
Eliminarporque 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
Eh estado leyendo un poco de objetos y métodos y ya resolvieron mi duda.
ResponderEliminarGracias de todos modos.
Slds!
Si yo quiero que el programa lea 10 números donde debo colocar el ciclo para ? Por favor y muchas gracias
ResponderEliminares mas facil asi no?
ResponderEliminarpublic 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);
}
}
solo llegue a centenas. si quieren ponerle mas es solo seguir de lo mismo
Eliminarhola, 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"
ResponderEliminarsaludos
perdón amigo, el error fue mío, no puse bien el código
ResponderEliminarsaludos
disculpen y para hacer el método al revez que no solo convierta de arábigo a romano
ResponderEliminardisculpen y para hacer el método al revez que no solo convierta de arábigo a romano
ResponderEliminarimport java.util.Scanner;
Eliminarimport 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 ");
}
}
}
}
HOLA
ResponderEliminarme 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.......
Y si quiero Ingresar un numero entero entre 0 y 3999, y me lo devuelva el numero en romano?
ResponderEliminarAlguien me ayuda?
ty bro te pasaste
ResponderEliminarAquí mi solución. Saludos!
ResponderEliminarimport 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);
}
}
Gracias a todos por sus aportes son de vital importancia para todo aquel que necesita ayuda. Saludos
ResponderEliminarHola buenas. Alguien me podria ayudar a como acer una calculadora de numeros romanos en java en el netbeans
ResponderEliminarcomparto mi código
ResponderEliminarmanden 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;
}
}
Ayuda es en java
ResponderEliminarDesarrolla 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.
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
ResponderEliminarpero a orientada a objetos ?
ResponderEliminar