Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

Extraction d'un chiffre

Posté par
manto235
31-12-08 à 17:11

Bonjour,
Dans le cadre de la programmation d'un petit programme simple en LMA, je dois extraire un chiffre.

On me donne un entier d'au moins 5 chiffres et je dois être capable de renvoyer le 4e chiffre.
Je dispose d'opérations simples : +, -, *, /, <, >, <=,...

J'ai essayé de trouver une suite d'opérations qui permette de faire ça mais je n'y parviens pas. A mon avis, il doit y avoir une petite astuce à trouver.

Merci d'avance pour votre aide.

Edit jamo : forum modifié.

Posté par
jamo Moderateur
re : Extraction d'un chiffre 31-12-08 à 17:12

Bonjour,

il faudrait la fonction qui retourne la partie entière d'un nombre.

As-tu ça ?

Posté par
manto235
re : Extraction d'un chiffre 31-12-08 à 17:16

J'ai une fonction qui permet de faire la division entière.

Posté par
jamo Moderateur
re : Extraction d'un chiffre 31-12-08 à 17:20

C'est un peu embêtant si on ne connait pas le nombre de chiffres du nombre initial.

As-tu la fonction logarithme ? (ou mieux encore : le log décimal)

Posté par
jamo Moderateur
re : Extraction d'un chiffre 31-12-08 à 17:22

Sinon, j'ai aussi une autre idée qui permet d'éviter tout calcul.

Si le langage permet de convertir un entier en chaine de caractère, et ensuite une fonction qui permet d'extraire un caractère à une position donnée dans une chaine, puis de reconvertir ce caractère en chiffre, le tour est joué ! Beaucoup de langages ont ce type de fonctions ...

Posté par
manto235
re : Extraction d'un chiffre 31-12-08 à 17:23

Non, je n'ai pas ces fonctions.
J'ai été bloqué au même endroit parce qu'on a pas le nombre de chiffres au départ...

Posté par
manto235
re : Extraction d'un chiffre 31-12-08 à 17:27

Oui, j'y ai pensé aussi.. en java, cela aurait été assez simple à faire je pense.

Mais ici, on travaille avec une espèce de langage machine qui utilise des registres.
Par exemple, pour faire un chiffre A + un chiffre B, on doit d'abord charger A dans un registre, B dans un autre pour ensuite faire la somme.
Pour faire a+b+c ; on doit faire a+b et ensuite, le résultat + c.

Posté par
jamo Moderateur
re : Extraction d'un chiffre 31-12-08 à 17:29

En effet, le langage semble assez peu évolué ...

Quand tu parles du 4ème chiffre, c'est celui à partir de la gauche ou de la droite ?

Posté par
manto235
re : Extraction d'un chiffre 31-12-08 à 17:41

Je pense que c'est celui à partir de la gauche, ce qui serait logique.

Mais si on part de la droite, on pourrait diviser le nombre par 1000 et prendre le reste.
Ensuite, on aurait un chiffre à virgule (le chiffre cherché en partie entière). La division entière avec 1 nous renverrait-elle seulement le chiffre cherché ?

Posté par
jamo Moderateur
re : Extraction d'un chiffre 31-12-08 à 17:49

C'est vrai que si c'est à partir de la droite, c'est plus simple car on n'a pas besoin de connaitre le nombre de chiffres.

Sinon, j'ai une idée. Car il est possible d'extraire les chiffres à partir de la droite l'un après l'autre.
Bon, ne connaissant pas le nombre de chiffres, on pourrait peut-etre supposer qu'il y en a un maximum (du genre 10 ou 20, je ne sais pas).
Exempe, si je prends le nombre 2636875 à 7 chiffres, il serait possible d'extraire 10 chiffres par la droite, ça donnerait :
5
7
8
6
3
6
2
0
0
0
(on finirait par des zéros).

Ensuite, si on stocke tout ça dans un tableau (ou des variables), on cherche, en partant de la fin, à partir de quand on n'a plus de 0, puis on compte le 4ème chiffre.

Un truc de ce genre est-il envisageable ?

Posté par
manto235
re : Extraction d'un chiffre 31-12-08 à 18:00

Ca

Posté par
manto235
re : Extraction d'un chiffre 31-12-08 à 18:03

Désolé pour le double-post, faute de frappe..

Ca ne me semble pas réalisable ou alors très difficilement vu le langage utilisé.
Mais j'ai aussi trouvé quelque chose.

On pourrait faire une boucle : tant que le chiffre divisé par 10 est plus grand que zéro, on incrémente une variable.
Ainsi, on peut savoir de combien de chiffres est composé l'entier.

Ensuite, on fait une autre boucle qui va encore diviser le chiffre par 10 jusqu'à arriver au 4e.

Posté par
jamo Moderateur
re : Extraction d'un chiffre 31-12-08 à 18:06

Ah oui, pas bête, ça permettrait de connaitre le nombre de chiffres.

Ensuite, une petite manip permettrait d'extraire le chiffre qu'il faut.

Bon, l'idée semble là, mais avec ce langage, je te souhaite bon courage pour le codage de tout ceci !

Posté par
patrice rabiller
re : Extraction d'un chiffre 31-12-08 à 18:33

Pour satisfaire macuriosité, ça veut dire quoi LMA ? Je sais que ce sigle est utilisé au Canada pour désigner les canadiens bilingues de Langue Maternelle Anglaise... mais ça doit être autre chose

Pour en revenir au langage minimaliste de manto235, ça me fait penser à mes premiers pas en programmation où on ne disposait que de quelques instructions et d'une mémoire minuscule... (il y a 35 ans)

Posté par
matovitch
re : Extraction d'un chiffre 31-12-08 à 19:16

Bonsoir !
Si la division entière tronque le résultat et renvoie un entier alors j'ai une idée d'algo :

mem <- division entière du nombre par 10    'si on a abcde on aura abcd

Faire
mem <- mem-1000
tant que mem>1000          'A la fin on aura bcd

Faire
mem <- mem-100
tant que mem>100           'A la fin on aura cd

Faire
mem <- mem-10
tant que mem>10            'A la fin on aura d

Afficher mem

Et si il n'y a pas de do...loop while il faudra mettre 24 conditions à la place.

Posté par
matovitch
re : Extraction d'un chiffre 31-12-08 à 19:18

Ce langage me semble proche de l'assembleur avec les variables que l'on doit mettre dans le registre de travail pour calculer...etc

Posté par
jamo Moderateur
re : Extraction d'un chiffre 31-12-08 à 20:04

matovitch >> attention, la méthode que tu utilises suppose que le nombre de départ a 5 chiffres, alors qu'il a 5 chiffres au minimum (ce qui complique la chose).

Posté par
matovitch
re : Extraction d'un chiffre 01-01-09 à 12:27

Bon alors un autre :

mem1 <- 100000

Tant que nb > mem1
mem1 <- mem1 * 10
Fin tant que

mem2 <- division entière de nb  par (mem1/10000)

mem1 <- 1000

Faire
Faire
mem2 <- mem2-mem1
tant que mem2 > mem1
mem1 <- mem1/10
tant que mem1 différent de 1

Afficher mem2

Posté par
matovitch
re : Extraction d'un chiffre 01-01-09 à 19:42

Extraction d\'un chiffre

Comme vous le voyez, ça marche en vb.

Posté par
manto235
re : Extraction d'un chiffre 12-01-09 à 22:26

C'est bizarre, je n'ai pas reçu de notifications pour les nouveaux messages...
LMA veut dire : langage (de la) machine.

Notre prof a créé un logiciel en java qui émule le langage machine (en gros).
Pour voir à quoi ça ressemble, voici le code d'un petit programme que j'ai dû faire il y a quelques temps :

Citation :

2000    LDA   1, 1500       // Chargement de l'adresse du tableau
2004    JUMP 15, 3000       // Appel du sous-programme
2008    HALT  0, 0
//
//   Sous-programme
//
// PRE : R1 contient l'adresse du tableau. R15 contient l'adresse de retour.
// POST : R0 contient le nombre de chifres qui sont suivis de leur double.
// INV : R0 = R0 + 1 si i = (i+1)/2.  (i étant une cellule du tableau)
//
3000    LDM   2, 0     (1)  // R2 = longueur du tableau
3004    LDA   0, 0          // R0 = 0
3008    JZ    2, 3050       // R2 ?= 0 (tableau non vide? => on continue)
3012    SUBA  2, 1          // R2 = R2 - 1 (on décrémente le nombre de chiffres restants dans le tableau)
3016    ADDA  1, 4          // R1 = R1 + 4 (prochaine cellule)
3020    LDM   3, 0     (1)  // R3 <= chargement de la cellule i
3024    LDM   4, 4     (1)  // R4 <= chargement de la cellule i+1
3028    MULA  3, 2          // R3 = Cellule i * 2
3032    COMP  3, 4          // Comparaison de R3 et R4
3034    JE    0, 3042       // Si R3 = R4, on JUMP en 3042 (on incrémente R0)
3038    JUMP  0, 3008       // Retour au début de la boucle
3042    ADDA  0, 1          // R0 = R0 + 1
3046    JUMP  0, 3008       // Retour au début de la boucle
3050    JUMP  0, 0     (15) // CLOT
//
//DATA
1500    LIT  I(7)           // Nombre de chiffres dans le tableau
1504    LIT  I(1)           // Cellule 1
1508    LIT  I(2)           // Cell 2
1512    LIT  I(4)           // Cell 3
1516    LIT  I(3)           // Cell 4
1520    LIT  I(7)           // Cell 5
1524    LIT  I(4)           // Cell 6
1528    LIT  I(8)           // Cell 7



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !