Autour de Kaprekar [th07] - Exercice
Karine Zampieri, St´ephane Rivi`ere
Unisciel algoprog Version 8 janvier 2017
Table des mati`eres
1 Algorithme de Kaprekar (18 points) 2
1.1 ´
Enonc´e ..................................... 2
1.2 Cas de trois chiffres (4 points) ....................... 2
1.3 Le suivant de Kaprekar (8 points) ..................... 3
1.4 Cas g´en´eral (6 points) ............................ 5
2 Nombre de Kaprekar (7 points) 6
C++ - Autour de Kaprekar (Examen)
Objectif
Cet exercice d´ecrit et r´ealise l’algorithme de Kaprekar et d´etermine les nombres de
Kaprekar.
Consignes :
Mots-cl´es : Analyse Structur´ee.
Dur´ee : 2 heures
Documents : Aucun
Langage : C++ et pseudo-code
Bar`eme : 25 points
Param`etres
Il est imp´eratif de r´ealiser des passages par r´ef´erence constant pour des tableaux et/ou
structures qui ne doivent pas ˆetre modifi´es. L’absence du qualificatif const induira une
p´enalit´e.
Doxygen (dans le barˆeme)
Les proc´edures et fonctions doivent ˆetre documenes.
1
Unisciel algoprog – Autour de Kaprekar [th07] 2
1 Algorithme de Kaprekar (18 points)
1.1 ´
Enonc´e
Algorithme de Kaprekar
Un des algorithmes (qui date des ann´ees 1949) du math´ematicien Kaprekar est le
suivant :
1. Prendre un entier positif.
2. Ordonner ses chiffres par ordre d´ecroissant et par ordre croissant.
3. Soustraire les deux entiers ainsi form´es.
4. Poursuivre ce processus jusqu’`a ce que l’une des possibilit´es suivantes soit atteinte :
0 (cas d´eg´en´er´e).
Un entier constant.
Un cycle.
Exemple
Voici deux it´erations du processus :
2213 -> 3221-1223=1998 -> 9981-1899=8082 -> etc
Objectif
Programmer cet algorithme pour un entier `a trois chiffres et dans le cas g´en´eral pour
des entiers d’au plus 9 chiffres.
1.2 Cas de trois chiffres (4 points)
Analyse
Pour un entier `a trois chiffres, l’algorithme fournit un entier constant dans les cas non
d´eg´en´er´es. Ainsi donc, le processus se poursuit tant que l’entier courant est diff´erent de
son pr´ed´ecesseur.
Pour d´eterminer le successeur d’un entier n, il s’agit de le d´ecomposer en ses trois chiffres
a,b,c, de les ordonner en sens d´ecroissant (par exemple) et d’en d´eduire les entiers n2
(le plus grand) et n1(le plus petit) puis d’en faire la diff´erence.
Exemple
n = 198
==> a=8, b=9, c=1
==> decroitre3i(a,b,c)
==> a=9, b=8, c=1
==> n2 = 9*100+8*10+1 = 981 et n1 = 1*100+8*10+9 = 189
==> n2-n1 = 981-189 = 792
Unisciel algoprog – Autour de Kaprekar [th07] 3
(0.5 point) ´
Ecrivez une proedure permuter2i(a,b) qui ´echange les contenus de deux
entiers aet b.
(0.5 point) ´
Ecrivez une proedure decroitre2i(a,b) qui classe deux entiers aet b
par ordre d´ecroissant, c.-`a-d. qu’`a l’issue de la proc´edure, adoit contenir le plus grand
entier et ble plus petit de (a,b).
(0.5 point) D´eduisez une proc´edure decroitre3i(a,b,c) qui classe trois entiers a,b
et cpar ordre d´ecroissant, en appelant trois fois la proc´edure decroitre2i :
Classez aet ben ordre d´ecroissant.
Puis classez bet cen ordre d´ecroissant.
Puis classez aet ben ordre d´ecroissant.
(1 point) D´eduisez une fonction kaprekarSucc3i(n) qui calcule et renvoie le suivant
d’un entier n(de trois chiffres) selon l’algorithme de Kaprekar (Voir ci-avant l’analyse).
Exemples :
kaprekarSucc3i(198) ==> 981-189=792
kaprekarSucc3i(792) ==> 972-279=693
(0.5 point) ´
Ecrivez une fonction saisieEntier(binf,bsup) qui renvoie un entier saisi
par l’utilisateur appartenant `a l’intervalle d’entiers [binf..bsup]. Il faudra it´erer la
saisie jusqu’`a ce que l’entier soit dans l’intervalle.
(1 point) Enfin ´ecrivez une proc´edure test_kaprekar3i qui saisit un entier `a trois
chiffres (donc compris entre 100 et 999) puis affiche la suite des nombres g´en´er´es selon
l’algorithme de Kaprekar. Exemple d’ex´ecution :
Entier dans [100..999]? 293
293
--> 693
--> 594
--> 495
--> 495
1.3 Le suivant de Kaprekar (8 points)
Analyse
Dans le cas g´en´eral, la premi`ere op´eration consiste `a repr´esenter les chiffres d’un entier
par un tableau d’entiers. Ainsi donc, pour calculer le suivant de Kaprekar, il convient
de :
1. D´ecomposer l’entier nen la s´equence de ses chiffres.
2. Trier cette s´equence de chiffres (par exemple par ordre croissant).
Unisciel algoprog – Autour de Kaprekar [th07] 4
3. ´
Evaluer la s´equence de chiffres, d’o`u l’entier n2(le plus grand).
4. Renverser la s´equence de chiffres.
5. ´
Evaluer la s´equence de chiffres, d’o`u l’entier n1(le plus petit).
6. Retourner l’entier n2n1.
Exemple
n = 1235648
==> cs=[8,4,6,5,3,2,1], nc=7
==> trierChiffres(cs)
==> cs=[1,2,3,4,5,6,8], nc=7
==> n2 = 8654321
==> renverserChiffres(cs)
==> cs=[8,6,5,4,3,2,1], nc=7
==> n1 = 1234568
==> n2-n1 = 8654321-1234568 = 7419753
(0.5 point) D´efinissez la constante TMAX=10 puis le type Chiffres comme ´etant :
Soit, une structure contenant un tableau de TMAX entiers et un entier nc repr´esen-
tant le nombre de chiffres effectif dans le tableau.
Soit, un vecteur dynamique d’entiers (type vector<int>).
(0.5 point) ´
Ecrivez une proedure ajouterChiffre(cs,val) qui ajoute un chiffre de
valeur val `a la fin d’un Chiffres cs. Exemple :
Soient: cs=[8,1,2,2], nc=4
Après: ajouterChiffre(cs,6)
Alors: cs=[8,1,2,2,6], nc=5
(1 point) D´eduisez une proc´edure decomposer(n,cs) qui d´ecompose un entier positif n
en ses chiffres (base 10) dans un Chiffres cs. Exemple : Pour 62218, la proedure doit
initialiser cs avec [8,1,2,2,6] et l’entier nc avec 5.
(1 point) Dualement, ´ecrivez une fonction evalChiffres(cs) qui calcule et renvoie la
valeur de l’entier repr´esene par un Chiffres cs. Exemple :
Soient: cs=[8,0,2,2,6], nc=5
evalChiffres(cs) ==> 62208
(0.5 point) ´
Ecrivez une proedure afficherChiffres(cs) qui affiche un Chiffres cs
en affichant chacun de ses chiffres.
Unisciel algoprog – Autour de Kaprekar [th07] 5
(2 points) ´
Ecrivez une proedure trierChiffres(cs) qui classe par ordre croissant les
´el´ements d’un Chiffres cs.´
Etant donn´e que le nombre d’´el´ements `a trier n’est pas
grand, optez pour une m´ethode de tri na¨
ıve (`a savoir en O(n2)), au choix : s´election du
maximum ou par insertion avec butoir.
(0.5 point) ´
Ecrivez une proedure renverserChiffres(cs) qui renverse les ´el´ements
d’un Chiffres cs. Exemple :
Soient: cs=[8,1,2,2,6], nc=5
Après: renverserChiffres(cs)
Alors: cs=[6,2,2,1,8], nc=5
(1 point) D´eduisez une fonction kaprekarSucc(n) qui calcule et renvoie le suivant d’un
entier nselon l’algorithme de Kaprekar (cf. Analyse ci-avant).
(1 point) ´
Ecrivez une proedure test_kaprekarSucc qui demande un entier puis affiche
la suite des nombres g´en´er´es selon l’algorithme de Kaprekar jusqu’`a ce que l’utilisateur
tape 0pour sp´ecifier qu’il veut finir. Exemple :
Entier dans [1..999999999]? 1235648
1235648
--> 7419753 (On continue 0==fin)? 1
--> 8429652 (On continue 0==fin)? 1
--> 7619733 (On continue 0==fin)? 0
1.4 Cas g´en´eral (6 points)
(1 point) Sachant que la longueur du cycle est d’au plus une vingtaine d’entiers pour
une taille de dix chiffres, que faut-il faire pour traiter le cas g´en´eral ?
´
Ecrivez votre r´eponse comme suit dans votre programme :
/*
...ici votre réponse...
*/
(DOXYGEN, 5 points) Compl´etez votre programme selon votre analyse.
Exemple d’ex´ecution :
Entier dans [1..999999999]? 1235648
1235648
--> 7419753
--> 8429652
--> 7619733
--> 8439552
--> 7509843
--> 9529641
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !