Partage
  • Partager sur Facebook
  • Partager sur Twitter

Algorithme Convertir nombre Entier en nombre Romain

Help

29 novembre 2012 à 21:00:08

Boujour,

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

Merci à vous
  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2012 à 1:46:36

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.
  • Partager sur Facebook
  • Partager sur Twitter
www.creationjeuxjava.fr - Unity3D - LibGDX - Tutoriels de Jeux vidéo !
30 novembre 2012 à 9:14:03

Merci JohnCarmack,

Enfaîte j'avais bien compris ce détails cependant, je ne sais pas l’écrire que :

dans le cas on prend 16 en chiffre et que sa donne XVI.

Le nombre de dizaine dans mon cas est égal a 1 donc sa donne X
Dois je déclarer que 1 c'est X avant mes calculs et comment ?

Concernant les unités sa me donne 6 unités mais comment après je dis que 6 sa correspond à VI ?

Mon blocage vient de là.

Merci pour votre aide .
  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2012 à 9:25:04

Relation entre le tableau d'entiers et les lettres romaines.

  • Partager sur Facebook
  • Partager sur Twitter
www.creationjeuxjava.fr - Unity3D - LibGDX - Tutoriels de Jeux vidéo !
30 novembre 2012 à 9:40:49

Merci de ton aide aide,

On commence seulement à faire un langage algorithmique simple avec des mot en français.

Tu as pas un exemple écrit pour que j'assimile cette logique.
  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2012 à 20:37:57

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.
  • Partager sur Facebook
  • Partager sur Twitter
19 octobre 2015 à 22:17:31

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);*/

        }while(arabes<1 || arabes >3999);

        /*Conversion*/

        int temp=arabes;

        int k=0;

        String conversion="";

        for(int i=0;i< nombres.length;++i){

        if(temp==4){

         temp=0;

         conversion=conversion+"IV";

        }

          while(temp>=nombres[i] && k<3){

            ++k;

           temp=temp-nombres[i];

           conversion=conversion+symboles.charAt(i);

           }

              if(i <nombres.length-1){

               if(temp/nombres[i+1]>1 && (((temp/nombres[i+1])*nombres[i+1])+nombres[i+1])==nombres[i])

            {   

                temp=temp-(nombres[i]-nombres[i+1]);

                conversion=conversion+symboles.charAt(i+1)+symboles.charAt(i);

            }

            }

               if(i<nombres.length-2){

        if(temp/nombres[i+2]>1 && (((temp/nombres[i+2])*nombres[i+2])+nombres[i+2])==nombres[i])

            { 

                temp=temp-(nombres[i]-nombres[i+2]);

                conversion=conversion+symboles.charAt(i+2)+symboles.charAt(i);

            }

            }

         k=0;

        if(temp==0){break;}

             }

        System.out.println("romains("+arabes+") = "+conversion);

    }

}

-
Edité par Mariton 19 octobre 2015 à 22:31:30

  • Partager sur Facebook
  • Partager sur Twitter
24 octobre 2015 à 9:09:38

Bonjour Mariton,


Je travaille sur ce code aussi.

Je ne comprends pas le calcul suivant :


if(j>=p){

x+=nombres[j];

p=j;

}else{

x-=(2*nombres[p]-nombres[j]);

p=j;}

Peux-tu m'expliquer s'il te plait ?.

Merci.

  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2021 à 18:13:44 - Message modéré pour le motif suivant : Réponse à un message supprimé


Le Tout est souvent plus grand que la somme de ses parties.