Solution du TD d'informatique No. 4 :
les listes

Patrick Gros -- Patrick.Gros@irisa.fr
Didier Le Botlan -- didier.le_botlan@inria.fr

Lundi 4 décembre 2000

1   Arithmétique en précision infinie

import java.io.* ;
import java.lang.* ;
import java.util.* ;

public class Liste {
    // Elements constitutifs des Listes
    int elt ;
    Liste suivant ;

    Liste(int i, Liste l) {
 elt = i ;
 suivant = l ;
    }

    // Creation d'une liste a partir d'une chaine de caracteres
    ///////////////////////////////////////////////////////////
    static Liste Faire_Liste_Iteratif(String chaine) {
 Liste l = null ;
 for (int i = 0 ; i < chaine.length() ; i++) {
     l = new Liste(Integer.parseInt(chaine.substring(i, i+ 1)), l) ;
 }
 return l ;
    }

    static Liste Faire_Liste_Recursif(String chaine) {
 if (chaine.length() == 0)
     return null ;
 return new Liste(Integer.parseInt(chaine.substring(chaine.length() - 1, chaine.length())),
    Faire_Liste_Recursif(chaine.substring(0, chaine.length() - 1))) ;
    }
    
    // Affichage d'une liste
    ////////////////////////
    static void Afficher_Liste(Liste l) {
 if (l != null) {
     Afficher_Liste(l.suivant) ;
     System.out.print(l.elt) ;
 }
    }
    
    // Copie d'une liste
    ////////////////////
    static Liste Copie_Liste(Liste l) {
 if (l == null)
     return null ;
 return  new Liste(l.elt, Copie_Liste(l.suivant)) ;
    }
    
    // Addition de deux listes
    //////////////////////////
    static Liste Addition_Liste(Liste l1, Liste l2) {
 return Addition_Liste_Aux(l1, l2, 0) ;
    }
    
    static Liste Addition_Liste_Aux(Liste l1, Liste l2, int retenue) {
 if (l1 == null && l2 == null && retenue == 0)
     return null ;
 if (l1 == null && l2 == null && retenue != 0)
     return new Liste(retenue, null) ;
 if (l1 == null && retenue == 0)
     return Copie_Liste(l2) ;
 if (l1 == null && retenue != 0) {
     int n = l2.elt + retenue ;
     return new Liste(n % 10, Addition_Liste_Aux(null, l2.suivant, n / 10)) ;
 }      
 if (l2 == null && retenue == 0)
     return Copie_Liste(l1) ;
 if (l2 == null && retenue != 0) {
     int n = l1.elt + retenue ;
     return new Liste(n % 10, Addition_Liste_Aux(l1.suivant, null, n / 10)) ;
 }
 int n = l1.elt + l2.elt + retenue ;
 return new Liste(n % 10, Addition_Liste_Aux(l1.suivant, l2.suivant, n / 10)) ;
    }
    
    // Multiplication de deux listes
    ////////////////////////////////
    // Calcul le produit de l par n en ajoutant la retenue.
    static Liste Mult_Liste(Liste l, int n, int retenue) {
 if (l == null) {
     if (retenue == 0)
  return null ;
     return new Liste(retenue, null) ;
 }
 int i = l.elt * n + retenue ;
 return new Liste(i % 10, Mult_Liste(l.suivant, n, i / 10)) ;
    }
    
    static Liste Multiplication_Liste(Liste l1, Liste l2) {
 if (l1 == null || l2 == null) {
     System.out.println("Multiplication impossible !") ;
     System.exit(0) ;
 }
 if (l2.suivant != null)
     return Addition_Liste(Mult_Liste(l1, l2.elt, 0), Mult_Liste(Multiplication_Liste(l1, l2.suivant), 10, 0)) ;
 else
     return Mult_Liste(l1, l2.elt, 0) ;
    }
    
    // Programme principal
    //////////////////////
    public static void main(String[] arg) {
 // Verification des arguments
 if (arg.length != 2) {
     System.out.println("Utilisation : java grands_nombres n1 n2") ;
     System.exit(0) ;
 }
 
 Liste l1 = Faire_Liste_Iteratif(arg[0]) ;
 Liste l2 = Faire_Liste_Recursif(arg[1]) ;
 System.out.print("Premier nombre : ") ;
 Afficher_Liste(l1) ;
 System.out.print("\nDeuxieme nombre : ") ;
 Afficher_Liste(l2) ;
 System.out.print("\nSomme : ") ;
 Afficher_Liste(Addition_Liste(l1, l2)) ;
 System.out.print("\nProduit : ") ;
 Afficher_Liste(Multiplication_Liste(l1, l2)) ;
 System.out.println() ;
    }
}

This document was translated from LATEX by HEVEA.