// Pour LLONG_MAX
factorielle longue longue (int n) {
si (n <0) {
fprintf(stderr, "Erreur :la factorielle n'est pas définie pour les nombres négatifs.\n");
sortie(1); // Quitte avec un code d'erreur
}
si (n ==0) {
renvoyer 1 ;
}
résultat long long =1 ;
pour (int je =1; je <=n; i++) {
if (LLONG_MAX / result
fprintf(stderr, "Erreur :la factorielle dépasse la valeur maximale de long long.\n");
sortie(1);
}
résultat *=je;
}
renvoyer le résultat ;
}
int main() {
numéro int ;
printf("Entrez un entier non négatif :");
if (scanf("%d", &num) !=1) {
fprintf(stderr, "Erreur :entrée non valide.\n");
renvoyer 1 ; // Quitte avec un code d'erreur
}
long long fait =factoriel(num);
printf("Factoriale de %d =%lld\n", num, fact);
renvoie 0 ;
}
```
Pour compiler et exécuter ce code :
1. Enregistrer : Enregistrez le code sous un fichier « .c » (par exemple, « factorial.c »).
2. Compiler : Ouvrez un terminal et utilisez un compilateur C (comme GCC) pour compiler le code :
```bash
gcc factoriel.c -o factoriel
```
3. Exécuter : Exécutez le programme compilé :
```bash
./factorielle
```
Le programme vous demandera d'entrer un numéro.
Améliorations et explications :
* Gestion des erreurs : Le code comprend des contrôles pour :
* Entrée négative : Il gère explicitement les entrées négatives, qui ne sont pas définies pour les factorielles.
* Débordement : Il empêche un débordement potentiel en vérifiant si la prochaine multiplication dépasserait la valeur maximale qu'un entier « long long » peut contenir (`LLONG_MAX`). L'utilisation de « long long » donne une plage plus grande que « int » ou « long ».
* Entrée invalide : Il vérifie si `scanf` a réussi à lire un entier.
* Type de données `long long` : L'utilisation de « long long » offre une plage plus large pour le calcul factoriel, vous permettant de calculer des factorielles de nombres plus grands avant de rencontrer un débordement. Cependant, même « long long » a des limites. Les factorielles croissent extrêmement rapidement.
* Effacer les messages d'erreur : Les messages d'erreur informent l'utilisateur du problème spécifique rencontré.
* Codes de sortie : Le programme utilise des codes de sortie appropriés (0 pour succès, 1 pour erreurs), ce qui constitue une bonne pratique pour les programmes susceptibles d'être appelés à partir d'autres scripts ou programmes.
N'oubliez pas que les factorielles croissent incroyablement vite. Même « long long » débordera pour des entrées relativement petites (par exemple, 21 !). Pour les factorielles arbitrairement grandes, vous devrez utiliser une bibliothèque arithmétique spécialisée à précision arbitraire.