Je suis en année préparatoire d'informatique et j'ai besoin d'assistance pour résoudre un problème algorithmique. (je n'ai aucune base de programmation)
Pour convertir 16 ( nombre entier ) en XVI ( Chiffre romain ).
Je pensais faire 2 tableaux tout d'abord
Un tableau T 1 :
X
V
I
Et un tableau T2:
10
5
1
Ensuite pour l'algorithme j'ai commencé comme sa :
Début
n : entier positif
n= 16
n div 10 = d // d: nombre de dizaine
u= n(d*10) // u: unités
Et après je suis bloqué pouvez m'aider svp ?
Car je ne vois pas comment dire tout d'abord que 10 c'est X
Et je vois pas comment continuer cet algorithme
Tu déclares un tableau avec les lettres romaines.
Un tableau avec les valeurs correspondantes.
Un pointeur sur tes tableaux Romain et Décimal.
tu boucle sur le nombre de caractères entrés et tu regardes combien de fois une des lettres romaines apparaît, tu incrémentes ta variable avec la valeur décimal correspondante.
Tu devrais considérer que IX, IV, et tous les symboles du genre « une petite valeur soustraite à la grande valeur suivante » sont des « chiffres » au même titre que I, V, X … et partir de la valeur la plus grande à la valeur la plus petite.
Considérons que tu as les chiffres romains avec la valeur entre parenthèses :
X (10), IX (9), V (5), IV (4), I (1)
Si tu pars de la plus grande valeur, tu ajoutes X au nombre romain, et tu obtiens X. Tu retires 10 à la valeur de ton nombre, et il reste 22.
Tu refais ça, et tu obtiens XX et 12
Tu le refais encore, et tu obtiens XXX et 2
Maintenant, le nombre qui te reste est plus petite que 10, donc tu passes à la valeur inférieure, ici IX. De même, toutes les valeurs sont trop grandes, jusqu'à atteindre I, et tu rajoutes deux I, et tu as alors XXXII et 0. Donc 32 = XXXII.
Avec 14, ça donnerait XIV, en utilisant la même méthode que précédemment et en considérant que IV est un seul symbole avec sa propre valeur.
Ensuite, avec les bonnes valeurs pour chaque symbole et en déterminant tous les symboles qui peuvent poser problème, il te sera facile de faire un petit algorithme capable de transformer n'importe quel nombre arabe en nombre romain.
Je mets mon codes parce que ça peut servir à l'occasion, perso j'ai cherché un algo qui est peut être dégue mais qui fonction sur les valeurs que je lui ai présenté.
PS: C'est clairement du bricolage! Donc mon code est surement pas optimisé. Mais il pourrait servir de base de départ à quelqu'un. Je le post histoire de poser ma pierre à l'édifice.
import java.util.Scanner;
class Romain {
public static void main(String[] args) {
Scanner clavier = new Scanner(System.in);
int[] nombres = {1000, 500, 100, 50, 10, 5, 1 };
String symboles = "MDCLXVI";
final int MAX = 3999;
/*Declaration des variables*/
boolean bool=false;
String carChaine, rom;
String chaine;
/* */
/*do {*/
System.out.print("Entrez un nombre en chiffres romains : ");
/*Saisi clavier*/
chaine= clavier.nextLine();
chaine=chaine.intern();
chaine=chaine.toUpperCase();
/*System.out.println("La valeur entre "+chaine);*/
/*test de conformite*/
for(int i=0; i<chaine.length(); ++i){
carChaine=chaine.substring(i,i+1);
for(int j=0; j<symboles.length();j++){
rom=symboles.substring(j,j+1);
if(carChaine.equals(rom))
{bool=true;break;}
else{bool=false;}
}
if(bool==false){System.out.println("Conversion impossible, nombre romain mal formé.");break;}
}
/*}while(bool==false);*/
if(bool){
/*Conversion*/
/*Variables*/
int x=0;
int p=0; /*Variable permet la soustraction*/
for(int i=0; i<chaine.length(); ++i){
carChaine=chaine.substring(i,i+1);
for(int j=0; j<symboles.length();j++){
rom=symboles.substring(j,j+1);
if(carChaine.equals(rom))
{ if(j>=p){x+=nombres[j];
p=j;
}else{
x-=(2*nombres[p]-nombres[j]);
p=j;}
}
}
}
System.out.println("arabes("+chaine+") = "+x);
}
/*Entre chiffre arabes*/
int arabes=0;
do {
System.out.print("Entrez un nombre (en chiffres arabes) compris entre 1 et " + MAX + " : ");
/*Saisi clavier*/
arabes= clavier.nextInt();
/*System.out.println("La valeur entre "+chaine);*/
Le Tout est souvent plus grand que la somme de ses parties.