Changement de base⚓︎
Les bases des bases⚓︎
Représentation des nombres dans différentes bases
Nous allons faire des fonctions permettant de convertir un nombre décimal en une autre base ou d'une autre base en décimal.
Les nombres en base 10 seront représentés par des nombres entiers et ceux des autres bases seront représentés par des chaînes de caractères.
Ainsi le nombre 54 sera représenté par l'entier 54
en décimal, en "110110"
en binaire et "36"
en hexadécimal.
Alphabet pour Ă©crire les nombres
Pour pouvoir gérer les bases de plus de \(10\) chiffres, nous allons rajouter un alphabet :
alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
L'indice de chaque symbole est le chiffre auquel il correspond. Ainsi, Ă l'indice 2 correspond Ă "2"
, alors que l'indice 15 correspond Ă "F"
, comme en hexadécimal.
Cette variable est prédéfinie pour tous les exercices.
Puisque cet alphabet a 36 symboles, il permet d'aller jusqu'Ă la base 36.
Trouver le symbole Ă partir d'un chiffre
Lorsque vous avez la valeur du chiffre et que vous voulez le symbole, il faut chercher à l'indice donné :
>>> alphabet[5]
'5'
>>> alphabet[10]
'A'
>>> alphabet[15]
'F'
Trouver le chiffre Ă partir du symbole
Pour retrouver la valeur d'un chiffre d'un nombre en base \(b\), il est possible d'utiliser l'expression suivante :
>>> alphabet.index("5")
5
>>> alphabet.index("A")
10
>>> alphabet.index("F")
15
Manipulation des chaînes de caractères
On rappelle qu'il est possible d'ajouter des caractères en début ou en fin de chaînes à l'aide des affectations suivantes :
>>> resultat = "11"
>>> resultat = "0" + resultat
>>> resultat
'011'
>>> resultat = resultat + "2"
>>> resultat
'0112'
De la base 10 à la base b⚓︎
MĂ©thode des divisions
Pour convertir un nombre exprimé en base 10 en un nombre exprimé en base \(b\), on peut utiliser la méthode des divisions :
Donc \(185_{10} = 2321_{4}\).
Rappels sur la division euclidienne
On rappelle que le quotient de la division euclidienne est donné par a // b
et le reste par a % b
.
Exercice 1
Écrire le code de la fonction conversion
qui prend en paramètres un entier nb
et un entier non nul b
et qui renvoie le texte correspondant au nombre nb
exprimé en base b
. On utilisera la méthode des divisions.
Indices
Indice 1
Voici l'état des variables et des expressions au cours des différentes étapes de l'algorithme :
nb |
nb // b |
nb % b |
res |
---|---|---|---|
185 | 46 | 1 | "1" |
nb |
nb // b |
nb % b |
res |
---|---|---|---|
185 | 46 | 1 | "1" |
46 | 11 | 2 | "21" |
nb |
nb // b |
nb % b |
res |
---|---|---|---|
185 | 46 | 1 | "1" |
46 | 11 | 2 | "21" |
11 | 2 | 3 | "321" |
nb |
nb // b |
nb % b |
res |
---|---|---|---|
185 | 46 | 1 | "1" |
46 | 11 | 2 | "21" |
11 | 2 | 3 | "321" |
2 | 0 | 2 | "2321" |
Indice 2
On fait toujours la dernière étape hors de la boucle (nous verrons pourquoi dans la solution).
Il faut donc une condition pour la boucle while
qui permet de déterminer qu'on n'est pas encore à la dernière étape.
Indice 3
Lors de la dernière étape, on a toujours nb < b
.
>>> conversion(1, 2)
'1'
>>> conversion(10, 2)
'1010'
>>> conversion(255, 2)
'11111111'
>>> conversion(255, 4)
'3333'
>>> conversion(255, 6)
'1103'
>>> conversion(255, 16)
'FF'
# Tests
(insensible Ă la casse)(Ctrl+I)
De la base b à la base 10⚓︎
MĂ©thode de Horner
Pour exprimer un nombre en base 10 à partir de sa représentation en base \(b\), on utilise la méthode de Horner. Elle consiste à faire des mutliplications successives par \(b\), tout en ajoutant successivement les chiffres du nombres à convertir.
Voici un exemple :
Donc \(2321_{4} = 185_{10}\).
Parcourir un texte de gauche Ă droite
Pour parcourir un texte de gauche Ă droite, on peut le faire symbole par symbole :
for symbole in texte:
print(symbole)
Ou alors, indice par indice :
for indice in range(len(texte)):
symbole = texte[indice]
print(symbole)
Exercice 2
Écrire le code de la fonction deconversion
qui prend en paramètres un texte nb
et un entier non nul b
et qui renvoie la valeur en base 10 correspondant au nombre nb
exprimé en base b
. On suppose que le nombre nb
est bien une Ă©criture valide d'un nombre en base b
. On utilisera la méthode de Horner pour faire le changement de base.
Indices
Indice 1
La variable chiffre
prend successivement les différents symboles de nb
. Il faut donc transformer la valeur de chiffre
en nombre.
Indice 2
Il faut utiliser alphabet
.
Indice 3
L'expression alphabet.index(symbole)
renvoie l'indice de symbole
dans alphabet
.
>>> deconversion("1001", 2)
9
>>> deconversion("1011", 2)
11
>>> deconversion("1010", 2)
10
>>> deconversion("10101010", 2)
170
>>> deconversion("7F", 16)
127
>>> deconversion("55", 6)
35
# Tests
(insensible Ă la casse)(Ctrl+I)
# Tests
(insensible Ă la casse)(Ctrl+I)
# Tests
(insensible Ă la casse)(Ctrl+I)