Calculer les Factoriels en C

CBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez à calculer les factoriels en langage C. Le laboratoire couvre deux méthodes pour calculer le factoriel d'un nombre : en utilisant une boucle itérative et une fonction récursive. Vous commencerez par lire une entrée entière de l'utilisateur, puis implémenterez les approches basées sur les boucles et récursives pour calculer le factoriel, et enfin afficherez le résultat.

Le laboratoire fournit des instructions étape par étape et des exemples de code pour vous guider tout au long du processus, assurant une compréhension complète du calcul du factoriel en C.

Lecture d'un entier n

Dans cette étape, vous apprendrez à lire une entrée entière pour calculer son factoriel dans un programme C. Nous allons nous concentrer sur la création d'un programme simple qui invite l'utilisateur à entrer un nombre et le stocke pour un calcul ultérieur.

Tout d'abord, créons un nouveau fichier C dans le répertoire du projet :

cd ~/project
nano factorial.c

Maintenant, ajoutez le code suivant pour lire une entrée entière :

#include <stdio.h>

int main() {
    int n;

    printf("Entrez un nombre pour calculer son factoriel : ");
    scanf("%d", &n);

    printf("Vous avez entré : %d\n", n);

    return 0;
}

Compilons et exécutons le programme :

gcc factorial.c -o factorial
./factorial

Sortie d'exemple :

Entrez un nombre pour calculer son factoriel : 5
Vous avez entré : 5

Dans ce code :

  • printf() est utilisé pour afficher une invite à l'utilisateur
  • scanf() lit l'entrée entière de l'utilisateur
  • %d est le spécificateur de format pour les entiers
  • &n transmet l'adresse mémoire de la variable n pour stocker l'entrée

Calcul de n! avec une boucle ou une récursion

Dans cette étape, vous apprendrez deux méthodes pour calculer le factoriel d'un nombre : en utilisant une boucle itérative et une fonction récursive. Nous allons modifier le fichier factorial.c précédent pour implémenter les deux approches.

Mettre à jour le fichier factorial.c :

cd ~/project
nano factorial.c

Ajoutez le code suivant pour implémenter le calcul du factoriel à l'aide d'une boucle et d'une récursion :

#include <stdio.h>

// Calcul du factoriel en utilisant une boucle itérative
unsigned long long factorialLoop(int n) {
    unsigned long long result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

// Calcul du factoriel en utilisant la récursion
unsigned long long factorialRecursive(int n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    return n * factorialRecursive(n - 1);
}

int main() {
    int n;

    printf("Entrez un nombre pour calculer son factoriel : ");
    scanf("%d", &n);

    if (n < 0) {
        printf("Le factoriel n'est pas défini pour les nombres négatifs.\n");
        return 1;
    }

    printf("Factoriel en utilisant une boucle : %llu\n", factorialLoop(n));
    printf("Factoriel en utilisant la récursion : %llu\n", factorialRecursive(n));

    return 0;
}

Compiler et exécuter le programme :

gcc factorial.c -o factorial
./factorial

Sortie d'exemple :

Entrez un nombre pour calculer son factoriel : 5
Factoriel en utilisant une boucle : 120
Factoriel en utilisant la récursion : 120

Points clés de cette implémentation :

  • unsigned long long est utilisé pour gérer les valeurs factorielle plus grandes
  • La méthode de boucle utilise une boucle for pour multiplier les nombres
  • La méthode récursive s'appelle elle-même avec n-1 jusqu'à ce que le cas de base soit atteint
  • La gestion des erreurs pour les nombres négatifs a été ajoutée
  • Les deux méthodes produisent le même résultat

Affichage du Factoriel

Dans cette étape, vous améliorerez le programme de calcul du factoriel pour fournir une sortie plus détaillée et gérer différents scénarios d'entrée. Nous allons modifier le fichier factorial.c pour améliorer la présentation des résultats du factoriel.

Mettre à jour le fichier factorial.c :

cd ~/project
nano factorial.c

Remplacez le contenu précédent par l'implémentation améliorée suivante :

#include <stdio.h>

unsigned long long factorialLoop(int n) {
    unsigned long long result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

void printFactorialDetails(int n, unsigned long long factorial) {
    printf("Détails du calcul du factoriel :\n");
    printf("Nombre (n) : %d\n", n);
    printf("Factoriel (n!) : %llu\n", factorial);

    printf("Développement factoriel : ");
    for (int i = 1; i <= n; i++) {
        printf("%d%s", i, (i < n) ? " × " : " = ");
    }
    printf("%llu\n", factorial);
}

int main() {
    int n;

    printf("Entrez un entier non négatif pour calculer son factoriel : ");
    scanf("%d", &n);

    if (n < 0) {
        printf("Erreur : Le factoriel n'est pas défini pour les nombres négatifs.\n");
        return 1;
    }

    if (n > 20) {
        printf("Avertissement : Le factoriel pour les grands nombres peut entraîner un dépassement d'entier.\n");
    }

    unsigned long long result = factorialLoop(n);
    printFactorialDetails(n, result);

    return 0;
}

Compiler et exécuter le programme :

gcc factorial.c -o factorial
./factorial

Sortie d'exemple :

Entrez un entier non négatif pour calculer son factoriel : 5
Détails du calcul du factoriel :
Nombre (n) : 5
Factoriel (n!) : 120
Développement factoriel : 1 × 2 × 3 × 4 × 5 = 120

Améliorations clés de cette version :

  • Ajout d'une fonction détaillée printFactorialDetails()
  • Affichage du développement complet du factoriel
  • Inclusion d'un avertissement pour les grands nombres
  • Sortie claire et informative

Résumé

Dans ce laboratoire, vous avez appris à lire une entrée entière de l'utilisateur et à calculer son factoriel à l'aide d'une boucle itérative et d'une fonction récursive. Vous avez exploré le processus de création d'un programme C qui demande à l'utilisateur un nombre, gère les entrées négatives et affiche le résultat du factoriel. Le laboratoire a couvert les étapes clés de la lecture de l'entrée utilisateur, de la mise en œuvre des algorithmes de calcul du factoriel et de l'affichage du résultat final.