用 C 语言计算排列数(nPr)

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,我们将学习如何在C编程中计算排列数(nPr)。本实验涵盖以下步骤:

首先,我们将读取n和r的输入值,这是计算排列数所必需的。我们将使用scanf()函数从用户那里获取输入,并打印输入的值以确认输入。

接下来,我们将实现函数来计算阶乘和排列数(nPr),使用公式nPr = n! / (n-r)!。我们将处理r大于n的情况,并相应地显示错误消息。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-435151{{"用 C 语言计算排列数(nPr)"}} c/math_functions -.-> lab-435151{{"用 C 语言计算排列数(nPr)"}} c/user_input -.-> lab-435151{{"用 C 语言计算排列数(nPr)"}} c/output -.-> lab-435151{{"用 C 语言计算排列数(nPr)"}} end

读取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;
    }

    // 使用公式:n! / (n - r)! 计算nPr
    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("一次选取 %d 个项目的排列数(nPr)为:%llu\n", n, r, result);
    }

    return 0;
}

编译并运行程序:

gcc permutations.c -o permutations
./permutations

示例输出:

输入项目总数(n):5
输入要选择的项目数(r):3
一次选取5个项目中的3个项目的排列数(nPr)为: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;
    }

    // 使用公式:n! / (n - r)! 计算nPr
    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编程中计算排列数至关重要。我们还实现了使用公式n! / (n - r)! 来计算阶乘和排列数(nPr)的函数。

关键的学习要点包括使用scanf()读取整数输入、实现阶乘和排列数计算函数,以及处理r大于n的无效输入情况。