#include #include /* Fonctions de base */ typedef struct chiffre { unsigned int valeur; struct chiffre *suivant; } Chiffre; typedef Chiffre *Entier; Entier nouveau_chiffre(unsigned int valeur,Entier suivant) { Entier r; r = (Entier)malloc(sizeof(Chiffre)); if (r == NULL) { fprintf(stderr,"Plus de memoire !\n"); exit(-1); } r->valeur = valeur; r->suivant = suivant; return r; } void afficher(Entier p) { if (p == NULL) printf("0"); else { if (p->suivant != NULL) afficher(p->suivant); printf("%u",p->valeur); } } Entier grandir(unsigned int i) { if (i == 0) return NULL; else { return nouveau_chiffre(i % 10,grandir(i/10)); } } /* Calcul de factorielle */ Entier mult(unsigned int n, Entier p,unsigned int retenue) { Entier r; unsigned int t; if (p == NULL) { return grandir(retenue); } t = n * p->valeur + retenue; r = mult(n,p->suivant,t/10); return nouveau_chiffre(t%10,r); } Entier fact(unsigned int n) { if (n <= 0) return nouveau_chiffre(1,NULL); else return mult(n,fact(n-1),0); } void main(void) { unsigned int n; for (;;) { printf("n="); scanf("%u",&n); printf("%u",n); printf("! = "); afficher(fact(n)); printf("\n\n"); } }