Exercice 145
Énoncé
La capacité des nombres entiers est limitée par la taille du type longint. Créer une
classe big_int permettant de manipuler des nombres entiers de valeur absolument
quelconque.
Pour ne pas alourdir l’exercice, on se limitera à des nombres sans signe et à
l’opération d’addition ; on s’arrangera toutefois pour que des expressions mixtes
(c’est-à-dire mélangeant des objets de type long_int avec des entiers usuels) aient un
sens.
On définira l’opérateur << pour qu’il permette d’envoyer un objet de type big_int sur
un flot. Parmi les différents constructeurs, on en prévoira un avec un argument de
type chaîne de caractères, correspondant aux chiffres d’un « grand entier ».
On fera en sorte que l’affectation et la transmission par valeur d’objets de type
big_int ne posent aucun problème.
Pour représenter un « grand entier », la démarche la plus naturelle (mais pas la plus
économique en place mémoire !) consiste à conserver le nombre sous forme décimale,
à chaque chiffre étant associé un caractère. Pour ce faire, on peut choisir de « coder »
un tel chiffre par le caractère correspondant (‘0’ pour 0, ‘1’ pour 1…) ; on peut aussi
choisir de placer une valeur égale au chiffre lui-même (0 pour 0, 1 pour 1…). La
dernière solution oblige à effecteur un « transcodage » lorsque l’on doit passer de la
forme chaîne de caractères à la forme big_int (dans le constructeur correspondant,
notamment) ou, inversement, lorsqu’on doit passer de la forme big_int à la forme suite
de caractères (pour l’affichage). En revanche, elle simplifie quelque peu l’algorithme
d’addition, et c’est elle que nous avons choisie.
L’emplacement permettant de conserver un grand entier sera alloué dynamiquement ; sa
taille sera, naturellement, adaptée à la valeur du nombre qui s’y trouvera. On
conservera également le nombre courant de chiffres de l’entier ; on pourrait, en toute
rigueur, s’en passer mais nous verrons que sa présence simplifie quelque peu la
programmation. En ce qui concerne l’ordre de rangement des chiffres au sein de
l’emplacement correspondant, il y a manifestement deux possibilités. Chacune possède
des avantages et des inconvénients ; nous avons ici choisi de ranger les chiffres dans
360
Énoncé
La capacité des nombres entiers est limitée par la taille du type longint. Créer une
classe big_int permettant de manipuler des nombres entiers de valeur absolument
quelconque.
Pour ne pas alourdir l’exercice, on se limitera à des nombres sans signe et à
l’opération d’addition ; on s’arrangera toutefois pour que des expressions mixtes
(c’est-à-dire mélangeant des objets de type long_int avec des entiers usuels) aient un
sens.
On définira l’opérateur << pour qu’il permette d’envoyer un objet de type big_int sur
un flot. Parmi les différents constructeurs, on en prévoira un avec un argument de
type chaîne de caractères, correspondant aux chiffres d’un « grand entier ».
On fera en sorte que l’affectation et la transmission par valeur d’objets de type
big_int ne posent aucun problème.
Pour représenter un « grand entier », la démarche la plus naturelle (mais pas la plus
économique en place mémoire !) consiste à conserver le nombre sous forme décimale,
à chaque chiffre étant associé un caractère. Pour ce faire, on peut choisir de « coder »
un tel chiffre par le caractère correspondant (‘0’ pour 0, ‘1’ pour 1…) ; on peut aussi
choisir de placer une valeur égale au chiffre lui-même (0 pour 0, 1 pour 1…). La
dernière solution oblige à effecteur un « transcodage » lorsque l’on doit passer de la
forme chaîne de caractères à la forme big_int (dans le constructeur correspondant,
notamment) ou, inversement, lorsqu’on doit passer de la forme big_int à la forme suite
de caractères (pour l’affichage). En revanche, elle simplifie quelque peu l’algorithme
d’addition, et c’est elle que nous avons choisie.
L’emplacement permettant de conserver un grand entier sera alloué dynamiquement ; sa
taille sera, naturellement, adaptée à la valeur du nombre qui s’y trouvera. On
conservera également le nombre courant de chiffres de l’entier ; on pourrait, en toute
rigueur, s’en passer mais nous verrons que sa présence simplifie quelque peu la
programmation. En ce qui concerne l’ordre de rangement des chiffres au sein de
l’emplacement correspondant, il y a manifestement deux possibilités. Chacune possède
des avantages et des inconvénients ; nous avons ici choisi de ranger les chiffres dans
360
