简介
在这个实验中,我们将学习如何在 C 编程中计算排列数(nPr)。本实验涵盖以下步骤:
首先,我们将读取 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;
}
// 使用公式: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 的无效输入情况。



