请提供用C语言实现的两种方法:一是递归计算组合数C(n, m),其公式为c(n, m) = c(n-1, m) + c(n-1, m-1);二是非递归方式,利用阶乘来计算n! / m!(n-m)! 的组合数。请分别给出对应的C代码实现。
时间: 2024-10-23 21:13:28 浏览: 62
c代码-组合数计算啦啦啦
首先,让我们看如何使用递归的方式在C语言中计算组合数C(n, m):
```c
#include <stdio.h>
// 递归函数计算组合数
int combination_recursive(int n, int m) {
if (m == 0 || m == n)
return 1;
else
return combination_recursive(n - 1, m) + combination_recursive(n - 1, m - 1);
}
int main() {
int n, m;
printf("请输入两个整数n和m:");
scanf("%d %d", &n, &m);
// 确保m不会超过n
if (m > n) {
printf("错误:m不能大于n.\n");
return 1;
}
printf("C(%d,%d) = %d\n", n, m, combination_recursive(n, m));
return 0;
}
```
接下来是非递归的方式,通过计算阶乘来得到组合数:
```c
#include <stdio.h>
#include <math.h>
// 计算阶乘
double factorial(int n) {
double fact = 1;
for (int i = 1; i <= n; ++i) {
fact *= i;
}
return fact;
}
// 非递归方式计算组合数
double combination_iterative(int n, int m) {
double numerator = factorial(n);
double denominator = factorial(m) * factorial(n - m);
return numerator / denominator;
}
int main() {
int n, m;
printf("请输入两个整数n和m:");
scanf("%d %d", &n, &m);
// 非递归方法同样需要验证输入条件
if (m > n) {
printf("错误:m不能大于n.\n");
return 1;
}
printf("C(%d,%d) = %.0f\n", n, m, combination_iterative(n, m));
return 0;
}
```
阅读全文