简介
在本实验中,你将学习如何使用 C 程序计算组合数(nCr)。本实验涵盖两个主要步骤:读取 n 和 r 的输入值,然后实现公式来计算组合数 nCr = n! / (r! * (n-r)!)。完成本实验后,你将拥有一个能为任意给定的 n 和 r 值计算组合数的可运行 C 程序。
本实验首先演示如何使用scanf()函数读取 n 和 r 的输入值。然后介绍阶乘和组合计算函数的实现,这些函数用于计算最终结果。本实验提供了完整的代码和逐步说明,便于你跟随并将这些概念应用到自己的项目中。
读取 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)使用公式和阶乘函数计算组合数。



