/*----------------------------------------------------------*/ /* */ /* AUTHOR : Eric VIOLARD */ /* E-MAIL : violard@icps.u-strasbg.fr */ /* ORGANISM : Université Louis Pasteur (Strasbourg) */ /* CREATION : 23/11/02 */ /* */ /* ---------------------------------------------------------*/ #include #include /* pour utiliser les fonctions printf et scanf */ /* --- Définition du type des grands entiers --- */ /* munis des opérations : - construction d'un grand entier (de type grand_entier) à partir d'un entier (de type int) - nombre de chiffres d'un grand entier - lecture d'un grand entier - écriture d'un grand entier - addition de 2 grands entiers - multiplication de 2 grands entiers */ grand_entier cons_grand_entier(int n) /* conversion d'une valeur de type int en une valeur de type grand_entier */ { grand_entier N; /* résultat */ int quotient10=n; /* quotients des divisions successives de n par 10 (initialement n) */ int i; /* indices du tableau */ /* on parcours tous les chiffres de N en commencant par le chiffre des unités */ for(i=0;i0); /* tant que le chiffre est 0 */ /* l'indice du premier chiffre différent de 0 détermine le nombre de chiffres de N */ return i+1; } grand_entier lecture_grand_entier() /* lecture d'un grand entier sur l'entrée standard */ { grand_entier N; /* résultat */ char c; /* caractères lus */ int i=0; /* indices du tableau */ int nb_chiffres; /* nombre de chiffres du résultat */ printf("Entrer un grand entier (terminé par un .) : \n"); /* saisie de l'entier chiffre par chiffre (chaque chiffre étant représenté par un caractère) */ /* on remplit le tableau dans l'ordre inverse de la représentation de l'entier */ scanf(" %c",&c); while(i=(int)'0' && (int)c<=(int)'9') /* on ne considère que les caractères entre '0' et '9' */ { N.chiffre[i]=(int)c-(int)'0'; /* stocke un nouveau chiffre */ i++; /* passe au chiffre suivant */ } scanf(" %c",&c); } nb_chiffres=i; /* renversement du tableau */ for(i=0;i=0;i--) printf("%d",N.chiffre[i]); /* écriture d'un chiffre */ printf("\n"); } grand_entier somme_grand_entier(grand_entier N1,grand_entier N2) /* addition (comme à la main) de 2 grands entiers N1 et N2 */ /* pré-conditions : nb_chiffres(N1)+1 < MAX_NB_CHIFFRES && nb_chiffres(N2)+1 < MAX_NB_CHIFFRES */ { grand_entier N; /* résultat */ int retenue=0; /* retenue (initialement pas de retenue) */ int i; /* indices des tableaux */ /* on parcours les chiffres en commencant par le chiffre des unités */ for(i=0;i=0;i--) M.chiffre[i+p] = N.chiffre[i]; /* ajoute p zéros à la suite des chiffres */ for(i=0;i