用 C 语言计算组合数(nCr)

CCBeginner
立即练习

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

简介

在本实验中,你将学习如何使用C程序计算组合数(nCr)。本实验涵盖两个主要步骤:读取n和r的输入值,然后实现公式来计算组合数nCr = n! / (r! * (n-r)!)。完成本实验后,你将拥有一个能为任意给定的n和r值计算组合数的可运行C程序。

本实验首先演示如何使用scanf()函数读取n和r的输入值。然后介绍阶乘和组合计算函数的实现,这些函数用于计算最终结果。本实验提供了完整的代码和逐步说明,便于你跟随并将这些概念应用到自己的项目中。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/BasicsGroup(["Basics"]) c/BasicsGroup -.-> c/variables("Variables") c/ControlFlowGroup -.-> c/if_else("If...Else") 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-435146{{"用 C 语言计算组合数(nCr)"}} c/if_else -.-> lab-435146{{"用 C 语言计算组合数(nCr)"}} c/math_functions -.-> lab-435146{{"用 C 语言计算组合数(nCr)"}} c/user_input -.-> lab-435146{{"用 C 语言计算组合数(nCr)"}} c/output -.-> lab-435146{{"用 C 语言计算组合数(nCr)"}} end

读取n和r

在这一步中,你将学习如何在C程序中读取n和r的输入值以计算组合数。

首先,为你的组合计算程序创建一个新的C文件:

cd ~/project
nano combinations.c

现在,添加以下代码来读取输入值:

#include <stdio.h>

int main() {
    int n, r;

    // 提示用户输入n和r的值
    printf("输入n的值:");
    scanf("%d", &n);

    printf("输入r的值:");
    scanf("%d", &r);

    // 打印输入的值以验证输入
    printf("你输入的n = %d,r = %d\n", n, r);

    return 0;
}

编译并运行程序以测试输入:

gcc combinations.c -o combinations
./combinations

示例输出:

输入n的值:5
输入r的值:3
你输入的n = 5,r = 3

这段代码演示了如何:

  • 使用scanf()从用户读取整数输入
  • 提示用户输入n和r的值
  • 打印输入的值以确认输入正确

这段代码通过首先捕获必要的输入值n和r,为计算组合数奠定了基础。

计算nCr = n!/(r!(n - r)!)

在这一步中,你将实现一个函数来计算阶乘,并使用公式nCr = n! / (r! * (n - r)!) 计算组合数。

打开之前的combinations.c文件,并用阶乘和组合计算函数进行更新:

cd ~/project
nano combinations.c

添加以下代码来实现阶乘和组合计算:

#include <stdio.h>

// 计算阶乘的函数
unsigned long long factorial(int num) {
    if (num == 0 || num == 1) {
        return 1;
    }

    unsigned long long result = 1;
    for (int i = 2; i <= num; i++) {
        result *= i;
    }

    return result;
}

// 计算组合数(nCr)的函数
unsigned long long combinations(int n, int r) {
    // 验证输入
    if (r > n) {
        return 0;
    }

    // 使用组合公式:nCr = n! / (r! * (n - r)!)
    unsigned long long numerator = factorial(n);
    unsigned long long denominator = factorial(r) * factorial(n - r);

    return numerator / denominator;
}

int main() {
    int n, r;

    // 提示用户输入n和r的值
    printf("输入n的值:");
    scanf("%d", &n);

    printf("输入r的值:");
    scanf("%d", &r);

    // 计算并打印组合数
    unsigned long long result = combinations(n, r);

    printf("组合数C(%d, %d) = %llu\n", n, r, result);

    return 0;
}

编译并运行程序:

gcc combinations.c -o combinations
./combinations

示例输出:

输入n的值:5
输入r的值:3
组合数C(5, 3) = 10

此实现中的关键点:

  • factorial()函数计算给定数字的阶乘
  • combinations()函数实现组合公式
  • 使用unsigned long long处理更大的阶乘计算
  • 验证输入以防止无效组合

打印结果

在这一步中,你将通过添加更多信息丰富的输出和错误处理来增强组合计算程序。

打开combinations.c文件并修改代码:

cd ~/project
nano combinations.c

用改进后的结果打印和输入验证更新代码:

#include <stdio.h>

// 之前的阶乘和组合函数保持不变

int main() {
    int n, r;

    // 提示用户输入n和r的值
    printf("组合数(nCr)计算器\n");
    printf("----------------------------\n");

    // 输入验证
    do {
        printf("输入总项目数(n):");
        scanf("%d", &n);

        if (n < 0) {
            printf("错误:n必须是非负整数。\n");
        }
    } while (n < 0);

    do {
        printf("输入要选择的项目数(r):");
        scanf("%d", &r);

        if (r < 0 || r > n) {
            printf("错误:r必须在0到n之间。\n");
        }
    } while (r < 0 || r > n);

    // 计算组合数
    unsigned long long result = combinations(n, r);

    // 详细的结果输出
    printf("\n结果分解:\n");
    printf("----------------\n");
    printf("总项目数(n):%d\n", n);
    printf("要选择的项目数(r):%d\n", r);
    printf("可能的组合数(nCr):%llu\n", result);

    // 结果解释
    printf("\n解释:\n");
    printf("---------------\n");
    printf("从一组%d个项目中选择%d个项目有%llu种方法。\n",
           result, r, n);

    return 0;
}

编译并运行程序:

gcc combinations.c -o combinations
./combinations

示例输出:

组合数(nCr)计算器
----------------------------
输入总项目数(n):5
输入要选择的项目数(r):3

结果分解:
----------------
总项目数(n):5
要选择的项目数(r):3
可能的组合数(nCr):10

解释:
---------------
从一组5个项目中选择3个项目有10种方法。

主要改进:

  • 添加了输入验证以防止无效输入
  • 通过详细的结果分解增强了输出
  • 提供了组合结果的解释

总结

在本实验中,你学习了如何读取n和r的输入值,然后使用公式nCr = n! / (r! * (n - r)!) 计算组合数(nCr)。你实现了计算阶乘和组合数的函数,然后使用这些函数来计算最终结果。关键步骤是:1)读取n和r的输入值,以及2)使用公式和阶乘函数计算组合数。