Вычисление факториалов на C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном практикуме вы научитесь вычислять факториалы в языке программирования C. Практикум охватывает два метода вычисления факториала числа: с использованием цикла и рекурсивной функции. Вы начнете с ввода целого числа от пользователя, затем реализуете оба подхода — с циклом и рекурсивной функцией — для вычисления факториала и, наконец, выведете результат.

Практикум предоставляет пошаговые инструкции и примеры кода, чтобы помочь вам освоить процесс вычисления факториала в C, обеспечивая полное понимание этого процесса.

Ввод целого числа n

В этом шаге вы узнаете, как ввести целое число для вычисления его факториала в программе на языке C. Мы сосредоточимся на создании простой программы, которая запрашивает у пользователя ввод числа и сохраняет его для дальнейших вычислений.

Сначала создадим новый файл C в каталоге проекта:

cd ~/project
nano factorial.c

Теперь добавим следующий код для ввода целого числа:

#include <stdio.h>

int main() {
    int n;

    printf("Enter a number to calculate its factorial: ");
    scanf("%d", &n);

    printf("You entered: %d\n", n);

    return 0;
}

Теперь скомпилируем и запустим программу:

gcc factorial.c -o factorial
./factorial

Пример вывода:

Enter a number to calculate its factorial: 5
You entered: 5

В этом коде:

  • printf() используется для отображения запроса пользователю
  • scanf() считывает целое число, введённое пользователем
  • %d — спецификатор формата для целых чисел
  • &n передаёт адрес памяти переменной n для хранения введённого значения

Вычисление n! с помощью цикла или рекурсии

В этом шаге вы изучите два метода вычисления факториала числа: с использованием цикла и рекурсивной функции. Мы изменим предыдущий файл factorial.c, чтобы реализовать оба подхода.

Обновим файл factorial.c:

cd ~/project
nano factorial.c

Добавьте следующий код для реализации вычисления факториала с помощью цикла и рекурсии:

#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;
}

// Вычисление факториала с помощью рекурсии
unsigned long long factorialRecursive(int n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    return n * factorialRecursive(n - 1);
}

int main() {
    int n;

    printf("Enter a number to calculate its factorial: ");
    scanf("%d", &n);

    if (n < 0) {
        printf("Факториал не определен для отрицательных чисел.\n");
        return 1;
    }

    printf("Факториал с помощью цикла: %llu\n", factorialLoop(n));
    printf("Факториал с помощью рекурсии: %llu\n", factorialRecursive(n));

    return 0;
}

Скомпилируйте и запустите программу:

gcc factorial.c -o factorial
./factorial

Пример вывода:

Enter a number to calculate its factorial: 5
Factorial using loop: 120
Factorial using recursion: 120

Ключевые моменты этой реализации:

  • Используется тип данных unsigned long long для обработки больших значений факториалов
  • Метод цикла использует цикл for для умножения чисел
  • Рекурсивный метод вызывает сам себя с n-1, пока не достигнет базового случая
  • Добавлена обработка ошибок для отрицательных чисел
  • Оба метода дают одинаковый результат

Вывод факториала

В этом шаге вы улучшите программу вычисления факториала, чтобы получить более подробный вывод и обработать различные сценарии ввода. Мы изменим файл factorial.c, чтобы улучшить представление результатов факториала.

Обновите файл factorial.c:

cd ~/project
nano factorial.c

Замените предыдущее содержимое следующим улучшенным реализацией:

#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("Подробности вычисления факториала:\n");
    printf("Число (n): %d\n", n);
    printf("Факториал (n!): %llu\n", factorial);

    printf("Разложение факториала: ");
    for (int i = 1; i <= n; i++) {
        printf("%d%s", i, (i < n) ? " × " : " = ");
    }
    printf("%llu\n", factorial);
}

int main() {
    int n;

    printf("Введите неотрицательное целое число для вычисления его факториала: ");
    scanf("%d", &n);

    if (n < 0) {
        printf("Ошибка: Факториал не определен для отрицательных чисел.\n");
        return 1;
    }

    if (n > 20) {
        printf("Предупреждение: Факториал для больших чисел может привести к переполнению целых чисел.\n");
    }

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

    return 0;
}

Скомпилируйте и запустите программу:

gcc factorial.c -o factorial
./factorial

Пример вывода:

Введите неотрицательное целое число для вычисления его факториала: 5
Подробности вычисления факториала:
Число (n): 5
Факториал (n!): 120
Разложение факториала: 1 × 2 × 3 × 4 × 5 = 120

Основные улучшения в этой версии:

  • Добавлена функция printFactorialDetails() для подробного вывода
  • Отображается полное разложение факториала
  • Включено предупреждение для больших чисел
  • Предоставлен ясный и информативный вывод

Резюме

В этом лабораторном практикуме вы изучили, как считывать целое число от пользователя и вычислять его факториал, используя как итеративный цикл, так и рекурсивную функцию. Вы изучили процесс создания программы на языке C, которая запрашивает у пользователя число, обрабатывает отрицательные входные данные и выводит результат факториала. В лабораторном практикуме были рассмотрены ключевые этапы: считывание входных данных пользователя, реализация алгоритмов вычисления факториала и вывод конечного результата.