Вычисление перестановок и сочетаний на языке C

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Перестановка и комбинация - это два разных математических понятия. Перестановка - это упорядоченное расположение объектов. Комбинация - это выбор объектов из множества без учета порядка выбранных объектов. В этом лабораторном задании мы научимся вычислять перестановки и комбинации с использованием языка C.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/FileHandlingGroup(["File Handling"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/ControlFlowGroup -.-> c/if_else("If...Else") c/FunctionsGroup -.-> c/function_declaration("Function Declaration") c/FunctionsGroup -.-> c/function_parameters("Function Parameters") c/FunctionsGroup -.-> c/recursion("Recursion") c/FileHandlingGroup -.-> c/create_files("Create Files") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/if_else -.-> lab-123209{{"Вычисление перестановок и сочетаний на языке C"}} c/function_declaration -.-> lab-123209{{"Вычисление перестановок и сочетаний на языке C"}} c/function_parameters -.-> lab-123209{{"Вычисление перестановок и сочетаний на языке C"}} c/recursion -.-> lab-123209{{"Вычисление перестановок и сочетаний на языке C"}} c/create_files -.-> lab-123209{{"Вычисление перестановок и сочетаний на языке C"}} c/user_input -.-> lab-123209{{"Вычисление перестановок и сочетаний на языке C"}} c/output -.-> lab-123209{{"Вычисление перестановок и сочетаний на языке C"}} end

Напишите главную функцию

Сначала создайте новый файл с именем main.c в каталоге ~/project/ и напишите начальный код для включения заголовочных файлов и главной функции.

#include <stdio.h>

int main() {
    printf("Перестановки и комбинации на языке C\n\n");
    // Здесь будет добавлен код для вычисления перестановок и комбинаций
    return 0;
}

Напишите функцию для вычисления факториала

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

long factorial(int num) {
    if (num == 0) {
        return 1;
    }
    else {
        return num * factorial(num - 1);
    }
}

Эта функция принимает целое число в качестве аргумента и возвращает его факториал.

Напишите функцию для вычисления сочетаний из n по r

Добавьте следующую функцию вне главной функции для вычисления сочетаний из n по r.

long nCr(int n, int r) {
    if (n < r) {
        return -1;
    }
    else {
        return factorial(n) / (factorial(r) * factorial(n - r));
    }
}

Эта функция принимает два целых числа, n и r, в качестве аргументов и возвращает значение сочетаний из n по r. Значение сочетаний из n по r вычисляется путём деления факториала n на произведение факториалов r и n-r.

Напишите функцию для вычисления размещений из n по r

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

long nPr(int n, int r) {
    if (n < r) {
        return -1;
    }
    else {
        return factorial(n) / factorial(n - r);
    }
}

Эта функция принимает два целых числа, n и r, в качестве аргументов и возвращает значение размещений из n по r. Значение размещений из n по r вычисляется путём деления факториала n на факториал n-r.

Напишите код-диспетчер программы

Добавьте следующий код внутри главной функции для ввода значений и отображения результатов.

int main()
{
    int n, r;

    printf("Введите значение n:");
    scanf("%d", &n);
    printf("Введите значение r:");
    scanf("%d", &r);

    printf("nCr равно %ld\n", nCr(n, r));
    printf("nPr равно %ld\n", nPr(n, r));

    return 0;
}

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

Полный код

Завершённый код выглядит следующим образом.

#include <stdio.h>

long factorial(int num) {
    if (num == 0) {
        return 1;
    }
    else {
        return num * factorial(num - 1);
    }
}

long nCr(int n, int r) {
    if (n < r) {
        return -1;
    }
    else {
        return factorial(n) / (factorial(r) * factorial(n - r));
    }
}

long nPr(int n, int r) {
    if (n < r) {
        return -1;
    }
    else {
        return factorial(n) / factorial(n - r);
    }
}

int main()
{
    int n, r;

    printf("Введите значение n:");
    scanf("%d", &n);
    printf("\nВведите значение r:");
    scanf("%d", &r);

    printf("nCr равно %ld\n", nCr(n, r));
    printf("nPr равно %ld\n", nPr(n, r));

    return 0;
}

Резюме

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