Código Java
//Autor: Thiago Campos
//Data: 13/06/2012
//Programa escreve o numero decimal em Algarismo Romano para
valores ate 3999
import
java.util.Scanner;
/**
*
* @author Thiago
*/
public
class RomanConverter {
public static void main(String[] args) {
//declaração de variaveis
Scanner leia =
new Scanner(System.in);
int vlr, n;
int sobra = 0;
String roma =
"";
System.out.print("Informe um numero entre 1 e 3999:");
vlr =
leia.nextInt();
n = vlr; //guarda o valor digitado
//para 1000 ->M
if (vlr < 4000) {
while (vlr >= 1000) {
roma += "M";
vlr -=
1000;
}
//para 900 ->CM
while (vlr
>= 900) {
roma
+= "CM";
vlr -=
900;
}
//para 500 -> D
while (vlr
>= 500) {
roma
+= "D";
vlr -=
500;
}
//para 400 ->
CD
while (vlr
>= 400) {
roma
+= "CD";
vlr -=
400;
}
//para 100 ->
C
while (vlr
>= 100) {
roma
+= "C";
vlr -=
100;
}
//para 90 -> XC
while (vlr
>= 90) {
roma
+= "XC";
vlr -=
90;
}
//para 50 -> L
while (vlr
>= 50) {
roma
+= "L";
vlr -=
50;
}
//para 40 -> XL
while (vlr
>= 40) {
roma
+= "XL";
vlr -=
40;
}
//para 10 -> X
while (vlr
>= 10) {
roma
+= "X";
vlr -=
10;
}
//para 9 -> IX
while (vlr
>= 9) {
roma
+= "IX";
vlr -=
9;
}
//para 5 -> V
while (vlr
>= 5) {
roma
+= "V";
vlr -=
5;
}
//para 4 -> IV
while (vlr
>= 4) {
roma
+= "IV";
vlr -=
4;
}
//para 1 -> I
while (vlr
>= 1) {
roma
+= "I";
vlr -=
1;
}
System.out.println("O Algarismo Romano correspondente a " +n+ " é " +
roma);
} else {
System.out.print("Valor Inválido!");
} //fim do else
} //fim do main
} //fim da classe
Olá Thiago
ResponderExcluirachei um erro no seu codigo
o valor de 900 é "CM" e não "CD" ;)
Obrigado Gliter! Você tem razão, 900 é CM e não CD. O referido erro já foi corrigido.
ExcluirObrigado pela atenção dada ao meu código. A idéia deste blog é ajudar estudantes a tirar suas dúvidas sobre código Java.
Ps. Também sou estudante e tenho muiiitas dúvidas! rs...
Portanto, sinta-se a vontade para encontrar erros...
Um abraço!
na verdade o seu codigo funciona para até 4999, pois a partir deste valor devemos usar uma barra em cima dos valores, etc etc
ResponderExcluirHum... Confesso que não pensei fazê-lo para 4999, é tanto que há uma validação de entrada para valores ate 3999.
ExcluirOutro detalhe é que para fazê-lo funcionar ate 4999 precisarei inserir ao código um while (vlr >= 4000) para que ele escreva corretamente 4 mil. Senão escreverá MMMM ao invés de MV(v com traço em cima).
E sinceramente, não sei se tem como escrever um traço em cima da letra.
Mais uma vez, obrigado pela dica.
Um abraço
O seu código compilou perfeitamente, Thiago.
ResponderExcluirMeu professor de DSC I me passou esse exercício em sala e estava tendo muitas dificuldades para resolvê-lo. O seu código vai me ajudar bastante. Vou tentar entender cada passo que vc usou. Muito obrigado!
Fico grato em saber que te ajudei Hediman, Espero que você realmente entenda como foi feito afinal, este é o objetivo, AJUDAR! Bons estudos!
ResponderExcluirE se fosse ao contrario, de romano para arabe????
ResponderExcluirSegue algoritmo mais organizado e mais fácil:
ResponderExcluirpackage javaromano;
public class JavaRomano {
public static void main(String[] args) {
}
public static String gerar(int valor) {
String romanos[] = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
int div[] = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String saida = "";
String termos = "";
int res = 0;
int i = 0;
do {
res = valor / div[i];
termos = "";
for (int j = 1; j <= res; j++) {
termos += romanos[i];
}
saida += termos;
valor = valor % div[i];
i++;
} while (valor != 0);
return saida;
}
public static long romanoToDecimal(String romano) {
String r[] = new String[]{"CM", "CD", "XC", "XL", "IX", "IV", "M", "D", "C", "L", "X", "V", "I"};
int d[] = new int[]{900, 400, 90, 40, 9, 4, 1000, 500, 100, 50, 10, 5, 1};
String valor = romano;
for (int i = 0; i < r.length; i++) {
if (valor.contains(r[i])) {
valor = valor.replace(r[i], d[i] + "#");
}
}
Object decimais[] = valor.split("#");
long total = 0;
for (int i = 0; i < decimais.length; i++) {
if (decimais[i].toString() != null) {
total += new Integer(decimais[i].toString());
}
}
return total;
}
}
Para usar :gerar(valor decimal) retorna a String com valor em Romano;
romatoToDecimal(String romano) retorna o inteiro com o valor em romano convertido.
Este comentário foi removido pelo autor.
ResponderExcluirOla, eu gostaria de postar uma abreviação do seu programa usando array e ciclo for;
ResponderExcluirimport java.util.Scanner;
/**
*
* @author tom rita
* based in Thiago Campo
*/
public class TesteNumeros {
public static void main(String[] args) {
//declaração de variaveis
Scanner leia = new Scanner(System.in);
int vlr, n;
int sobra = 0;
String roma = "";
String[] r={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
int[] i={1,4,5,9,10,40,50,90,100,400,500,900,1000};
System.out.print("Informe um numero entre 1 e 3999:");
vlr = leia.nextInt();
n = vlr; //guarda o valor digitado
if (vlr < 4000) {
for(int cont=12;cont>-1;cont--){
while (vlr>=i[cont]){
roma += r[cont];
vlr -= i[cont];
}
}
System.out.println("O Algarismo Romano correspondente a " +n+ " é " + roma);
} else {
System.out.print("Valor Inválido!");
} //fim do else
}
}
Obrigado Marcelo e Tom pelas novas maneiras de se obter o resultado. Fiquem a vontade para reescrever e postar novas opções de códigos. É buscando novas soluções que aprendemos sempre algo mais. Um grande abraço.
ResponderExcluircomo posso converter um numero decimal para texto?
ResponderExcluirex.:se digitar 2 deve imprimir dois.
Olá... uma opção seria usar o CASE caso seja um numero limitado... tipo de 1 a 10... mas tb funcionará intervalos maiores, so ficará cansativo faze-lo.
ResponderExcluir