Nancy Université – UHP - ESSTIN

TD_Info_S1   N°4     (07.10.2009  14h-16h   A-210)

                                      Dernière MAJ : 06.10.2009  18:53 / H. Nguyen-Phu

Objectifs

 

Il est absolument nécessaire que les programmes tournent:  aucun étudiant ne peut passer dans le semestre supérieur s'il n'a pas réalisé au moins un programme qui tourne !

 

Exercice 1   Développer un algorithme pour trouver tous les nombres d'Armstrong. Le traduire en Java via un schéma-bloc approprié.

 

Corrigé partiel  1     Algorithme  de calcul  des nombres narcissiques d’ordre n (n= 3 ó Nb.  d’Armstrong) 

 

             Schéma-bloc proposé pour la classe ‘NbArmstrong’ 

 

 

NbArmstrong

 

 

   // Pas d’attributs (i.e.  donnée-membres)   ici !

 

// Constructeur :  Pas de constructeurs explicités  ici  !

// Pas de fonctions d’accès  ni de procédures modificatrices !

// Autres  méthodes :

+ PROCEDURE  calculArmstrong( ) //de classe ó‘static’ en Java

+ PROC.  principale( args :  TABLEAU de CHAINE de CARACTERES)  // ó ‘main’  procédure (‘void’)  de classe (‘static’)   et publique  (‘public’)

_________________________________________________ 

 

Définition  des nombres narcissiques : 

Ce sont des entiers naturels  N à  n digits qui vérifient, lors la décomposition en base 10, la relation  du type:  

 

   N =  …  +   m*1000 + c*100+ d*10 + u =  …  + m^n + c^n  + d^n  + u^n;   

 

avec N pris dans l’intervalle [0, … ,  10^n  -1]. Ici, u indique les unités, d les dizaines, c les centaines et m le digit des milliers,  etc …

 

N est un nombre narcissique d’ordre 1 <=>                           u =  u^1    pour   N compris entre 0 et 9;

N est un nombre narcissique d’ordre 2  <=>                d*10 + u =  d^2  + u^2   pour  N compris entre 0 et 99;

N est un nombre d’Armstrong             <=> c*100+ d*10 + u =  c^3+d^3+u^3   pour  N compris entre 0 et 999;

N est un nombre narcissique d’ordre 4  <=> m*1000+c*100+d*10+u =  m^4+c^4+d^4+u^4 avec N entre 0 et 9999;

 

et ainsi de suite ...  [A COMPLETER !]

 

Question 1 : Quels sont les nombres narcissiques d’ordre 1 ?   Réponses= {0, 1,  . . . . . . . . . . . . . . . .. }

Question 2 : Et les deux  nombres narcissiques triviaux d’ordre 2  ?  Réponses =   0  et . . .

Question 3 : Donner deux  nombres d’Armstrong triviaux (ó narcissiques d’ordre 3) ?  Réponses=  . . . et  1

 

Algorithme : A compléter les points de suspension ci-dessous pour calculer tous les nombres d’Armstrong.

 

+ PROCEDURE  NbArmstrong :: calculArmstrong( )   {

     c, d, u, N, n  : ENTIER   // ó   int  c, d, u, N, n;    en Java

     n <- 3  //  ‘n’ = 3 ordre des nombres narcissiques ó Nb. d’Armstrong ici !

     POUR     N    DE    (10^n – 1)    FAIRE   //   [par pas de  -1]

//ó  for( N = (int)  Math.pow(10, n) – 1;  N > -1;  N--)    {

                c  <--     N     DIV    . . .                                // c : digit des centaines

                d  <--   (N   MOD    . . .   )  DIV    . . .          // d : digit des dizaines

    u   <--   N   MOD    . . .                                 // u : digit des unités

    SI   (N = c^n  + d^n + u^n)     ALORS  // ‘c^n’ ó (int)  Math.pow(c, n)  en Java

// ó        if ( N = = (int)  Math.pow(c, n) + (int)  Math.pow(d, n) + (int)  Math.pow(u, n) )   {

ECRIRE( « %d  est un nombre d’ Armstrong ! »,  N)

// ó  System.out.printf(« %d  est un nombre d’ Armstrong ! »,  N) ;

                 FSI

    FPOUR

} 

 

//  pow’   est une  fonction de classe (‘static’) : son appel est précédé par le nom de sa classe, ici ‘Math’ ;

//  Math.’  peut être omis si, au tout début du fichier Java, on  inclue la ligne  (cf. JDK  1.5 et plus) :

//   import   static   java.lang.Math.* ;   /*  cf.  Lexique   L.A.O. – Java   */

 

Rappel : 

 

DIV   est   l’opérateur de la division entière. A distinguer de l’opérateur “ / ” qui est aussi  une division entre deux  réels en Java.

MOD est l’opérateur donnant le reste de la division  ‘DIV’  entre deux entiers (‘%’  en Java).

Exemples :  19  DIV 2  = = 9 ;  19  MOD  2  = = 1  (car 19 est impair. A vérifier avec la calculatrice de Windows en affichage scrientifique !)

 

 

Variantes de l’algorithme ci-dessus  (optionnel) :

 

(i)  Proposer un  autre  algorithme  pour trouver les nombres d’Armstrong par ordre croissant,

Indication :  il suffit de modifier les bornes de ‘POUR … FPOUR’  par :

            POUR     N    DE   0   (10^n – 1)   FAIRE   //   [par  pas  =  +1]

//ó              for( N =  0;  N  < (int)  Math.pow(10, n);  ++N)    {

 

(ii ) Proposer un  algorithme pour  la généralisation à l’ordre ‘n’ des nombres narcissiques ( N  variant   de 0 à  Nmax inclus) en utilisant un tableau unidimensionnel pour les coefficients de la décomposition (optionnel).

 

Le traduire en Java. Que vaut  le nombre maximal ‘nMax’ de digits décimaux  concernant le type ‘long’ en Java  ?

Même question pour les autres  types primitifs  Java :  ‘int’, ‘short’ et ‘byte’.  On  fournit  le tableau comparatif ci-dessous :

 

 

     Type ‘ENTIER’| t : occupation |     Nmax = 2^(t-1) – 1                 |  nMax

   ---------------------------------------------------------------------------------

       ‘byte’     |     8 bits     |  Byte.MAX_VALUE    = 127               |   2

       ‘short’    |    16 bits     |  Short.MAX_VALUE   = 32767             |   4

       ‘int’      |    32 bits     |  Integer.MAX_VALUE = .........         |  ..

       ‘long’     |    64 bits     |  Long.MAX_VALUE    = ..................|  ..

 

 

Exercice 2   Mêmes questions pour les  nombres parfaits (égaux à la somme de leurs diviseurs).

 

Corrigé typique 2

 

 

 

Exercice 3 (non corrigé)   Mêmes questions pour la suite de Fibonacci  (cf. internet pour la définition et les calculs exacts et approchés pour n tendant vers l’infini  cf.  TypeEntier.MAX_VALUE  en Java  ci-dessus …).

 

 

Autres exercices (cf.  énoncé sur  ‘arche’- A  terminer ...)