Вычисление перестановок (nPr) на C

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

Введение

В этом лабораторном практикуме мы изучим, как вычислять перестановки (nPr) на языке программирования C. Практикум охватывает следующие шаги:

Сначала мы будем считывать входные значения для n и r, которые необходимы для вычисления перестановок. Мы будем использовать функцию scanf() для получения ввода от пользователя и выводить введенные значения для подтверждения ввода.

Далее мы реализуем функции для вычисления факториала и перестановки (nPr) по формуле nPr = n! / (n-r)!. Мы будем обрабатывать случай, когда r больше, чем n, и выводить соответствующее сообщение об ошибке.

Чтение значений n и r

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

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

cd ~/project
nano permutations.c

Теперь напишем код для чтения входных значений:

#include <stdio.h>

int main() {
    int n, r;

    printf("Введите общее количество элементов (n): ");
    scanf("%d", &n);

    printf("Введите количество элементов для выбора (r): ");
    scanf("%d", &r);

    printf("Вы ввели: n = %d, r = %d\n", n, r);

    return 0;
}

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

Введите общее количество элементов (n): 5
Введите количество элементов для выбора (r): 3
Вы ввели: n = 5, r = 3

Рассмотрим код подробнее:

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

Компилируем и запускаем программу:

gcc permutations.c -o permutations
./permutations

Вычисление nPr = n!/(n-r)!

В этом шаге мы реализуем функцию для вычисления перестановки (nPr), вычисляя факториалы.

Давайте изменим предыдущий файл permutations.c, добавив вычисление факториалов и перестановки:

cd ~/project
nano permutations.c

Теперь обновим код с функциями вычисления факториала и перестановки:

#include <stdio.h>

// Функция для вычисления факториала
unsigned long long factorial(int num) {
    unsigned long long result = 1;
    for (int i = 1; i <= num; i++) {
        result *= i;
    }
    return result;
}

// Функция для вычисления перестановки (nPr)
unsigned long long permutation(int n, int r) {
    // Проверка на некорректный ввод
    if (r > n) {
        printf("Ошибка: r не может быть больше n\n");
        return 0;
    }

    // Вычисление nPr по формуле: n! / (n-r)!
    return factorial(n) / factorial(n - r);
}

int main() {
    int n, r;

    printf("Введите общее количество элементов (n): ");
    scanf("%d", &n);

    printf("Введите количество элементов для выбора (r): ");
    scanf("%d", &r);

    unsigned long long result = permutation(n, r);

    if (result > 0) {
        printf("Перестановка (nPr) из %d элементов, взятых по %d, равна: %llu\n", n, r, result);
    }

    return 0;
}

Компилируем и запускаем программу:

gcc permutations.c -o permutations
./permutations

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

Введите общее количество элементов (n): 5
Введите количество элементов для выбора (r): 3
Перестановка (nPr) из 5 элементов, взятых по 3, равна: 60

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

  • Функция factorial() вычисляет факториал заданного числа.
  • Функция permutation() реализует формулу nPr: n! / (n-r)!.
  • Мы используем unsigned long long для обработки больших значений факториалов.
  • Проверка входных данных проверяет, что r меньше или равно n.

Вывод результата

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

Изменим файл permutations.c, чтобы улучшить представление результата:

cd ~/project
nano permutations.c

Обновим код с улучшенным выводом результата:

#include <stdio.h>

// Функция для вычисления факториала
unsigned long long factorial(int num) {
    unsigned long long result = 1;
    for (int i = 1; i <= num; i++) {
        result *= i;
    }
    return result;
}

// Функция для вычисления перестановки (nPr)
unsigned long long permutation(int n, int r) {
    // Проверка на некорректный ввод
    if (r > n) {
        printf("Ошибка: r не может быть больше n\n");
        return 0;
    }

    // Вычисление nPr по формуле: n! / (n-r)!
    return factorial(n) / factorial(n - r);
}

// Функция для вывода подробного объяснения перестановки
void printPermutationDetails(int n, int r, unsigned long long result) {
    printf("\n--- Подробности вычисления перестановки ---\n");
    printf("Общее количество элементов (n): %d\n", n);
    printf("Количество выбранных элементов (r): %d\n", r);
    printf("Вычисление: %d P %d = %d! / (%d - %d)!\n", n, r, n, n, r);
    printf("Результат: %llu возможных различных перестановок\n", result);
    printf("----------------------------------------\n");
}

int main() {
    int n, r;

    printf("Калькулятор перестановок (nPr)\n");
    printf("Введите общее количество элементов (n): ");
    scanf("%d", &n);

    printf("Введите количество элементов для выбора (r): ");
    scanf("%d", &r);

    unsigned long long result = permutation(n, r);

    if (result > 0) {
        printPermutationDetails(n, r, result);
    }

    return 0;
}

Компилируем и запускаем программу:

gcc permutations.c -o permutations
./permutations

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

Калькулятор перестановок (nPr)
Введите общее количество элементов (n): 5
Введите количество элементов для выбора (r): 3

--- Подробности вычисления перестановки ---
Общее количество элементов (n): 5
Количество выбранных элементов (r): 3
Вычисление: 5 P 3 = 5! / (5 - 3)!
Результат: 60 возможных различных перестановок
----------------------------------------

Основные улучшения:

  • Добавлена отдельная функция printPermutationDetails().
  • Включен более информативный вывод о вычислении.
  • Объяснена формула перестановки и результат.
  • Улуччен пользовательский интерфейс с заголовком и подробным объяснением.

Резюме

В этом лабораторном практикуме мы изучили, как считывать входные значения для n и r, которые необходимы для вычисления перестановок в программировании на языке C. Мы также реализовали функции для вычисления факториала и перестановки (nPr) по формуле n! / (n-r)!.

Ключевыми моментами обучения являются использование scanf() для считывания целочисленных входных данных, реализация функций вычисления факториала и перестановки, а также обработка некорректного ввода, когда r больше, чем n.