Calcular Factoriales en C

CBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderás a calcular factoriales en programación C. El laboratorio cubre dos métodos para calcular el factorial de un número: utilizando un bucle iterativo y una función recursiva. Empezarás leyendo un entero como entrada del usuario, luego implementarás los enfoques basados en bucles y recursivos para calcular el factorial y, finalmente, imprimirás el resultado.

El laboratorio proporciona instrucciones paso a paso y ejemplos de código para guiarte a través del proceso, asegurando una comprensión completa del cálculo factorial en C.

Leer un entero n

En este paso, aprenderás a leer una entrada de entero para calcular su factorial en un programa C. Nos centraremos en crear un programa simple que solicite al usuario que ingrese un número y lo almacene para su cálculo posterior.

Primero, creemos un nuevo archivo C en el directorio del proyecto:

cd ~/project
nano factorial.c

Ahora, agrega el siguiente código para leer una entrada de entero:

#include <stdio.h>

int main() {
    int n;

    printf("Ingrese un número para calcular su factorial: ");
    scanf("%d", &n);

    printf("Usted ingresó: %d\n", n);

    return 0;
}

Compilamos y ejecutamos el programa:

gcc factorial.c -o factorial
./factorial

Salida de ejemplo:

Ingrese un número para calcular su factorial: 5
Usted ingresó: 5

En este código:

  • printf() se utiliza para mostrar un mensaje al usuario.
  • scanf() lee la entrada de entero del usuario.
  • %d es el especificador de formato para enteros.
  • &n pasa la dirección de memoria de la variable n para almacenar la entrada.

Calcular n! Usando un Bucle o Recursión

En este paso, aprenderás dos métodos para calcular el factorial de un número: utilizando un bucle iterativo y una función recursiva. Modificaremos el archivo factorial.c anterior para implementar ambos enfoques.

Actualicemos el archivo factorial.c:

cd ~/project
nano factorial.c

Agrega el siguiente código para implementar el cálculo factorial usando un bucle y recursión:

#include <stdio.h>

// Cálculo factorial usando un bucle iterativo
unsigned long long factorialLoop(int n) {
    unsigned long long result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

// Cálculo factorial usando recursión
unsigned long long factorialRecursive(int n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    return n * factorialRecursive(n - 1);
}

int main() {
    int n;

    printf("Ingrese un número para calcular su factorial: ");
    scanf("%d", &n);

    if (n < 0) {
        printf("El factorial no está definido para números negativos.\n");
        return 1;
    }

    printf("Factorial usando bucle: %llu\n", factorialLoop(n));
    printf("Factorial usando recursión: %llu\n", factorialRecursive(n));

    return 0;
}

Compila y ejecuta el programa:

gcc factorial.c -o factorial
./factorial

Salida de ejemplo:

Ingrese un número para calcular su factorial: 5
Factorial usando bucle: 120
Factorial usando recursión: 120

Puntos clave de esta implementación:

  • Se utiliza unsigned long long para manejar valores factoriales más grandes.
  • El método de bucle utiliza un bucle for para multiplicar los números.
  • El método recursivo se llama a sí mismo con n-1 hasta que se alcanza el caso base.
  • Se agregó manejo de errores para números negativos.
  • Ambos métodos producen el mismo resultado.

Imprimir el Factorial

En este paso, mejorarás el programa de cálculo factorial para proporcionar una salida más detallada y manejar diferentes escenarios de entrada. Modificaremos el archivo factorial.c para mejorar la presentación de los resultados factoriales.

Actualiza el archivo factorial.c:

cd ~/project
nano factorial.c

Reemplaza el contenido anterior con la siguiente implementación mejorada:

#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("Detalles del Cálculo del Factorial:\n");
    printf("Número (n): %d\n", n);
    printf("Factorial (n!): %llu\n", factorial);

    printf("Expansión Factorial: ");
    for (int i = 1; i <= n; i++) {
        printf("%d%s", i, (i < n) ? " × " : " = ");
    }
    printf("%llu\n", factorial);
}

int main() {
    int n;

    printf("Ingrese un entero no negativo para calcular su factorial: ");
    scanf("%d", &n);

    if (n < 0) {
        printf("Error: El factorial no está definido para números negativos.\n");
        return 1;
    }

    if (n > 20) {
        printf("Advertencia: El factorial para números grandes puede causar desbordamiento de enteros.\n");
    }

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

    return 0;
}

Compila y ejecuta el programa:

gcc factorial.c -o factorial
./factorial

Salida de ejemplo:

Ingrese un entero no negativo para calcular su factorial: 5
Detalles del Cálculo del Factorial:
Número (n): 5
Factorial (n!): 120
Expansión Factorial: 1 × 2 × 3 × 4 × 5 = 120

Mejoras clave en esta versión:

  • Se agregó una función detallada printFactorialDetails().
  • Muestra la expansión factorial completa.
  • Incluye una advertencia para números grandes.
  • Proporciona una salida clara e informativa.

Resumen

En este laboratorio, aprendiste a leer una entrada de entero del usuario y calcular su factorial utilizando tanto un bucle iterativo como una función recursiva. Exploraste el proceso de crear un programa en C que solicita al usuario un número, maneja entradas negativas y muestra el resultado factorial. El laboratorio cubrió los pasos clave de leer la entrada del usuario, implementar algoritmos de cálculo factorial e imprimir el resultado final.