Finalmente consultando la rete sono riuscito a trovare un'algoritmo che mi permetta di definire la classe che trasforma un numero arabo (1...3999) in romano, seguendo le suddette specifiche:
In teoria non sarebbe possibile, anche se la materia è controversa.

Ecco le regole per la numerazione romana:


I: 1

II: 2

III: 3

IV /IIII: 4

V: 5

X: 10

L: 50

C: 100

D: 500

M: 1000


la scrittura del numero 4 era originariamente IV, ma in qualche caso è stato utilizzato il simbolo IIII. Un’eccezione costante alla regola originaria la fanno i quadranti degli orologi di prestigio, tutti col IIII.

La regola prevede che si possa anteporre il simbolo precedente al solo simbolo successivo nella scala dei simboli per sottrarre a questi il proprio valore, purché il simbolo precedente sia di un solo carattere e non sia multiplo di 5.

Ovvero si può scrivere XL per 40, CD per 400, XC per 90, ma non VX per 5 o LD per 450. Unica eccezione alla regola è il numero 4 che, scritto come IV, va considerato come un simbolo unico.

Allo stesso modo, non si potrebbe scrivere IM per 999 perché sottrarrebbe I da M, rispettivamente il primo e l’ultimo elemento della scala di valori.

Alcuni esempi:

1492: MCDXCII

1991: MCMXCI

40: XL

49: XLIX (ma potremmo scrivere IL, forzando la regola)

Da tali premesse ho implementato Romani.java:

/** classe che gestisce i numeri romani */
public class Romani {

/************************************************ le variabili di istanza **********************************************/
private String NrRomano="";
int NrArabo;
/************************************************** *** i costruttori ************************************************** */

/** costruisce un oggetto di tipo Romani String Nr.Romano
@param s di tipo Individuo, dati anagrafici dello studente corrispondente
all’oggetto Romani che si sta costruendo
@param n di tipo int, è il numero arabo da convertire
*/
public Romani(int n) {

if((n>0)&&(n<4000))
NrArabo = n;
else
//condizione di errore
NrRomano = "";
}//Romani


/************************************************** *** i metodi di accesso *********************************************/

/** @return il riferimento ad un oggetto di tipo String che corrisponde
al numero romano il quale rappresentata dall’oggetto ricevente */
public String getNumeroRomano() {
return NrRomano;
}//getNumeroRomano

/************************************************** ******** il metodo di utilita’ **************************************/

/** @return il riferimento ad un oggetto di tipo String che rappresenta
lo studente corrispondente all’oggetto ricevente */
public String toString() {
return NrArabo+" = "+NrRomano;
}//toString

/************************************************** ******* i metodi relazionali ****************************************/

/**@return il numero romano dell’oggetto ricevente*/
public String calcolaNumeroRomano(){
int[] VettArabo;
int count=0; //determina la lunghezza del vettore
int quoziente,i; //buffer

/*dividere il numero arabo per 10, conteggiando il numero di divisioni, fino a quando il quoziente non è pari
a zero, in modo tale da ricavare l'ordne del vettore e scindere il numero in cifre*/
quoziente=NrArabo;
do{
quoziente=quoziente/10;
count++;
}while(quoziente!=0);

//instanzio il vettore
VettArabo = new int[count];

//divido il numero in cifre mettendo alla cifra più significativa le migliaia e in quella meno significativa le unità
for(i=VettArabo.length;i<=0;i--){ //NON ENTRA NEL CICLO !!
VettArabo[i] = NrArabo%10;
System.out.print("VettArabo["+i+"]"+VettArabo[i]);
NrArabo/=10;
}//for

//Conversione
for(i=0;i<VettArabo.length;i++){
if(count==4){ //migliaia
if(VettArabo[i]==1)
NrRomano=NrRomano+"M";
else if(VettArabo[i]==2)
NrRomano=NrRomano+"MM";
else if(VettArabo[i]==3)
NrRomano=NrRomano+"MMM";
}//if count=4
else if (count==3){ //centinaia
if(VettArabo[i]==1)
NrRomano=NrRomano+"C";
else if(VettArabo[i]==2)
NrRomano=NrRomano+"CC";
else if(VettArabo[i]==3)
NrRomano=NrRomano+"CCC";
else if(VettArabo[i]==4)
NrRomano=NrRomano+"CD";
else if(VettArabo[i]==5)
NrRomano=NrRomano+"D";
else if(VettArabo[i]==6)
NrRomano=NrRomano+"DC";
else if(VettArabo[i]==7)
NrRomano=NrRomano+"DCC";
else if(VettArabo[i]==8)
NrRomano=NrRomano+"DCCC";
else if(VettArabo[i]==9)
NrRomano=NrRomano+"CM";
}//if count=3
else if (count==2){ //decine
if(VettArabo[i]==1)
NrRomano=NrRomano+"X";
else if(VettArabo[i]==2)
NrRomano=NrRomano+"XX";
else if(VettArabo[i]==3)
NrRomano=NrRomano+"XXX";
else if(VettArabo[i]==4)
NrRomano=NrRomano+"XL";
else if(VettArabo[i]==5)
NrRomano=NrRomano+"L";
else if(VettArabo[i]==6)
NrRomano=NrRomano+"LX";
else if(VettArabo[i]==7)
NrRomano=NrRomano+"LXX";
else if(VettArabo[i]==8)
NrRomano=NrRomano+"LXXX";
else if(VettArabo[i]==9)
NrRomano=NrRomano+"XC";
}//if count=2
else if (count==1){ //unità
if(VettArabo[i]==1)
NrRomano=NrRomano+"I";
else if(VettArabo[i]==2)
NrRomano=NrRomano+"II";
else if(VettArabo[i]==3)
NrRomano=NrRomano+"III";
else if(VettArabo[i]==4)
NrRomano=NrRomano+"IV";
else if(VettArabo[i]==5)
NrRomano=NrRomano+"V";
else if(VettArabo[i]==6)
NrRomano=NrRomano+"VI";
else if(VettArabo[i]==7)
NrRomano=NrRomano+"VII";
else if(VettArabo[i]==8)
NrRomano=NrRomano+"VIII";
else if(VettArabo[i]==9)
NrRomano=NrRomano+"IX";
}//if count=1
count--;
}//for

return NrRomano;
}//calcolaNumeroRomano

}//Romani



e la rispettiva classe di test definita TestRomani.java:

public class TestRomani {
/* classe di test per la classe Studente */
public static void main (String[] args) {

Romani NR; // numero romano
String risposta = "s",tmp; // per leggere le risposte dell’utente
int n;//numero arabo da convertire
int i; //index

/* visualizzazione della finalita’ della classe */
System.out.println("Classe di test per la classe Numeri Romani");
System.out.println();


/* ciclo di test */
while (risposta.equals("s")) {

System.out.print("Numero Arabo: ");
n = Input.readInt();

NR = new Romani(n);
tmp = NR.calcolaNumeroRomano();
if(tmp=="")
System.out.println("Errore nell'inserimento dei dati.");
else
System.out.println(n+" = "+tmp);


/* nuova interrogazione dell’utente e lettura della sua risposta */
System.out.print("Vuoi Inserire un nuovo Numero? [s/n] ");
risposta = Input.readString();
System.out.println();
}//while
}//main
}//TestRomani{}


Dalla compilazione non risultano errori sintattici, ma da un'attenta analisi step by step ho notato che probabilmente c'è un'errore semantico nel seguente ciclo contenuto nel file Romani.java:

...
//divido il numero in cifre mettendo alla cifra più significativa le migliaia e in quella meno significativa le unità
for(i=VettArabo.length;i<=0;i--){ //NON ENTRA NEL CICLO !!
VettArabo[i] = NrArabo%10;
System.out.print("VettArabo["+i+"]"+VettArabo[i]);
NrArabo/=10;
}//for
...

Si capisce facilmente dal commento questo ciclo for con down to cosa dovrebbe fare! Il condizionale è dobbligo inquanto stranamente non ci si entra mai nel ciclo!!

Se qualcuno è in grado di darmi qualche giustificazione ne sarei grato.