View Full Version : Programma per trasformare i numeri in numeri romani
sblantipodi
19-10-2003, 17:42
Salve ragazzi.
Sono alle prime armi con la programmazione Java.
Ho bisogno di creare un programmino in java che dato un numero restituisca il numero in cifre romane....
Ad esempio.
Se scrivo 1745
deve restituire MDCCVL
Qualcuno di voi saprebbe aiutarmi???
Se qualcuno non ricordasse tutti i numeri romani ecco qua :)
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
Io l'ho fatto in VB e che fa l'operazione opposta... se vuoi dargli un occhiata e cercarlo di convertirlo bene, altrimenti mi spiace che nn sono servito :(
Public Function CRomanoToNum(ByVal sNumRomano As String) As Long
'converte un numero da romano a arabo
Dim sAux As String
Dim sRomani(12) As String
Dim nArabici(12) As Integer
Dim nI As Integer
Dim nJ As Integer
Dim bTrovato As Boolean
'preparo la tabella di conversione
nArabici(0) = 1000
nArabici(1) = 900
nArabici(2) = 500
nArabici(3) = 400
nArabici(4) = 100
nArabici(5) = 90
nArabici(6) = 50
nArabici(7) = 40
nArabici(8) = 10
nArabici(9) = 9
nArabici(10) = 5
nArabici(11) = 4
nArabici(12) = 1
sRomani(0) = "M"
sRomani(1) = "CM"
sRomani(2) = "D"
sRomani(3) = "CD"
sRomani(4) = "C"
sRomani(5) = "XC"
sRomani(6) = "L"
sRomani(7) = "XL"
sRomani(8) = "X"
sRomani(9) = "IX"
sRomani(10) = "V"
sRomani(11) = "IV"
sRomani(12) = "I"
'ciclo per la conversione
nI = 1
Do
'primo ciclo per i numeri composti da due caratteri
nJ = -1
Do
bTrovato = False
nJ = nJ + 1
If Mid$(sNumRomano, nI, 2) = sRomani(nJ) Then
bTrovato = True
CRomanoToNum = CRomanoToNum + nArabici(nJ)
sAux = sAux & Mid$(sNumRomano, nI, 2)
End If
Loop Until bTrovato = True Or nJ = 12
'se nn trova due caratteri validi prende il valore del carattere singolo
If bTrovato = False Then
nJ = -1
Do
nJ = nJ + 1
If Mid$(sNumRomano, nI, 1) = sRomani(nJ) Then
bTrovato = True
CRomanoToNum = CRomanoToNum + nArabici(nJ)
sAux = sAux & Mid$(sNumRomano, nI, 1)
End If
Loop Until bTrovato = True Or nJ = 12
End If
nI = nI + 1
Loop Until Len(sAux) = Len(sNumRomano)
End Function
ciaooooooooooooooo :p
Tieni l'ho fatto al volo, dovrebbe andare ...
manca l'inseriemtno da tastiera però :D
class NumeriRomani {
/*
* Questa funzione converte un numero decimale in un numero romano
*
* I = 1
* II = 2
* III = 3
* IV = 4
* V = 5
* X = 10
* L = 50
* C = 100
* D = 500
* M = 1000
*
* */
public static String converti(int numeroDaConvertire) {
int numeroM = 0;
int numeroD = 0;
int numeroC = 0;
int numeroL = 0;
int numeroX = 0;
int numeroV = 0;
int numeroI = 0;
int resto;
int i;
String numeroRomano = "";
//quante M
numeroM = numeroDaConvertire/1000;
resto = numeroDaConvertire%1000;
//quante D
numeroD = resto/500;
resto = resto%500;
//quante C
numeroC = resto/100;
resto = resto%100;
//quante L
numeroL = resto/50;
resto = resto%50;
//quante X
numeroX = resto/10;
resto = resto%10;
//quante V
numeroV = resto/5;
resto = resto%5;
//quante I
numeroI = resto;
for(i=0; i<numeroM; i++) {
numeroRomano = numeroRomano+"M";
}
//ci può stare al massimo una D
if (numeroD > 0) {
numeroRomano = numeroRomano+"D";
}
//centinaia
if (numeroC>3 && numeroC != 0) {
numeroRomano = numeroRomano+"CD"; //400
} else
for(i=0;i<numeroC; i++)
numeroRomano = numeroRomano+"C";
//ci può stare al massimo una L
if (numeroL > 0) {
numeroRomano = numeroRomano+"L";
}
//decine
if (numeroX>3 && numeroX != 0) {
numeroRomano = numeroRomano+"XL"; //40
} else
for(i=0;i<numeroX; i++)
numeroRomano = numeroRomano+"X";
//ci può stare al massimo una V
if (numeroV > 0) {
numeroRomano = numeroRomano+"V";
}
//unità
if (numeroI>3 && numeroI != 0) {
numeroRomano = numeroRomano+"IV"; //4
} else
for(i=0;i<numeroI; i++)
numeroRomano = numeroRomano+"I";
return numeroRomano;
}
public static void main(String[] args) {
String numeroRomano = converti(1444);
System.out.println(numeroRomano);
}
}
ciao
Arpeda
sblantipodi
19-10-2003, 21:51
Originariamente inviato da matpez
Io l'ho fatto in VB e che fa l'operazione opposta... se vuoi dargli un occhiata e cercarlo di convertirlo bene, altrimenti mi spiace che nn sono servito :(
ciaooooooooooooooo :p
Grazie lo stesso molto gentile :)
sblantipodi
19-10-2003, 21:51
Originariamente inviato da Arpeda
Tieni l'ho fatto al volo, dovrebbe andare ...
manca l'inseriemtno da tastiera però :D
class NumeriRomani {
/*
* Questa funzione converte un numero decimale in un numero romano
*
* I = 1
* II = 2
* III = 3
* IV = 4
* V = 5
* X = 10
* L = 50
* C = 100
* D = 500
* M = 1000
*
* */
public static String converti(int numeroDaConvertire) {
int numeroM = 0;
int numeroD = 0;
int numeroC = 0;
int numeroL = 0;
int numeroX = 0;
int numeroV = 0;
int numeroI = 0;
int resto;
int i;
String numeroRomano = "";
//quante M
numeroM = numeroDaConvertire/1000;
resto = numeroDaConvertire%1000;
//quante D
numeroD = resto/500;
resto = resto%500;
//quante C
numeroC = resto/100;
resto = resto%100;
//quante L
numeroL = resto/50;
resto = resto%50;
//quante X
numeroX = resto/10;
resto = resto%10;
//quante V
numeroV = resto/5;
resto = resto%5;
//quante I
numeroI = resto;
for(i=0; i<numeroM; i++) {
numeroRomano = numeroRomano+"M";
}
//ci può stare al massimo una D
if (numeroD > 0) {
numeroRomano = numeroRomano+"D";
}
//centinaia
if (numeroC>3 && numeroC != 0) {
numeroRomano = numeroRomano+"CD"; //400
} else
for(i=0;i<numeroC; i++)
numeroRomano = numeroRomano+"C";
//ci può stare al massimo una L
if (numeroL > 0) {
numeroRomano = numeroRomano+"L";
}
//decine
if (numeroX>3 && numeroX != 0) {
numeroRomano = numeroRomano+"XL"; //40
} else
for(i=0;i<numeroX; i++)
numeroRomano = numeroRomano+"X";
//ci può stare al massimo una V
if (numeroV > 0) {
numeroRomano = numeroRomano+"V";
}
//unità
if (numeroI>3 && numeroI != 0) {
numeroRomano = numeroRomano+"IV"; //4
} else
for(i=0;i<numeroI; i++)
numeroRomano = numeroRomano+"I";
return numeroRomano;
}
public static void main(String[] args) {
String numeroRomano = converti(1444);
System.out.println(numeroRomano);
}
}
ciao
Arpeda
Lo provo e ti faccio sapere :)
sblantipodi
19-10-2003, 21:59
funonzia grazie mille :)
Sblantipodi: al tuo manca qualche "regola"... Ad esempio il 900 ed il 9...
Per convertire in numeri romani si può usare ilnromale algoritmo di conversione fra cifre...tra l'altro è molto + semplice...
string numeri_romani(unsigned int x)
{
struct cifra {
unsigned int num;
string str;
};
cifra vett[] = {{1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"},
{100, "C"}, {90, "XC"}, {50, "L"}, {40, "XL"},
{10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}};
if(x == 0)
return "0";
string str = "";
int i = 0;
while(x > 0)
{
if((x / vett[i].num) == 0)
++i;
else
{
str += vett[i].str;
x -= vett[i].num;
}
}
return str;
}
E' fatto in C++, ma credo che sia facile da convertire in Java... Se mi manca qualche regola basta aggiungere la cifra e il numero corrispondente alla lista di cifre in ordine descrescente...
sblantipodi
20-10-2003, 18:50
Originariamente inviato da sblantipodi
funonzia grazie mille :)
Mi contraddico, non funziona.
Prova a scrivere 45 con questo programma :(
Il prof. oggi ci ha detto che dobbiamo obbligatoriamente risolverlo utilizzando
il metodo charAt
45 viene tradotto in XLV che è corretto ... come diceva cionci non va bene se metti 9 o 90 perchè devi aggiungere qualche caso ...
charAt in che modo lo vuole usare il tuo professore?
Ciao
Arpeda
sblantipodi
21-10-2003, 19:17
Originariamente inviato da Arpeda
45 viene tradotto in XLV che è corretto ... come diceva cionci non va bene se metti 9 o 90 perchè devi aggiungere qualche caso ...
charAt in che modo lo vuole usare il tuo professore?
Ciao
Arpeda
45 si scrive VL :)
mica ne sarei tanto sicuro ... per esempio
48 è XLVIII mica IIL
di sicuro 40 è XL ma non so se 45 è VL anche perchè 48 come dici tu dovrebbe essere VLIII che non mi paer sia corretto
ciao
Arpeda
Ma charAT a che serve in Java ?
charAt
public char charAt(int index)
Returns the character at the specified index. An index ranges from 0 to length() - 1. The first character of the sequence is at index 0, the next at index 1, and so on, as for array indexing.
Parameters:
index - the index of the character.
Returns:
the character at the specified index of this string. The first character is at index 0.
ciao
Arpeda
Originariamente inviato da Arpeda
mica ne sarei tanto sicuro ... per esempio
48 è XLVIII mica IIL
di sicuro 40 è XL ma non so se 45 è VL anche perchè 48 come dici tu dovrebbe essere VLIII che non mi paer sia corretto
ciao
Arpeda
Mi hanno detto che la dicitura dei numeri romani dipende dal periodo storico... tu a che periodo devi fare riferimento? :sofico:
ciao
Arpeda
Originariamente inviato da Arpeda
charAt
...
E a cosa gli servirebbe ? Capisco se dovesse convertire da romani a decimale...ma non certo nel senso opposto :)
aspetto chiarimenti dal diretto interessato ...
magari converte il numero in stringa e da li in base alla posizione sceglie che lettera mettere
1923 lo ceonverte in stringa
poi vele la lunghezza della stringa che è 4
allora la prima cifra saranno migliaia poi centinaia poi decine e unità ma è una inutile complicazione, se dovesse essere così.
Ciao
Arpeda
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.