请编写函数,求组合数。 函数原型 double Cmb(int x, int y); 说明:x 和 y 为非负整数,且 x≥y,函数值为组合数 Cxy。 裁判程序 #include <stdio.h> ...(略)... double Cmb(int x, int y); int main() { int m, n; scanf("%d%d", &m, &n); printf("%.10g\n", Cmb(m, n)); return 0; } ...(略)... /* 你提交的代码将被嵌在这里 */ 要求:利用前面作业中的阶乘函数和排列数函数完成计算。 输入样例 4 2 输出样例 6
时间: 2024-01-14 17:04:17 浏览: 84
根据组合数的定义,组合数 C(x, y) 等于 x!/(y!*(x-y)!),可以利用前面作业中的阶乘函数和排列数函数完成计算。具体实现如下:
```c
double Factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * Factorial(n - 1);
}
}
double Perm(int x, int y) {
return Factorial(x) / Factorial(x - y);
}
double Cmb(int x, int y) {
return Perm(x, y) / Factorial(y);
}
```
在主函数中调用 `Cmb` 函数即可:
```c
int main() {
int m, n;
scanf("%d%d", &m, &n);
printf("%.10g\n", Cmb(m, n));
return 0;
}
```
相关问题
请编写递归函数,求组合数。 函数原型 double Cmb(int x, int y); 说明:x 和 y 为非负整数,且 x≥y,函数值为组合数 Cxy。 裁判程序 #include <stdio.h> double Cmb(int x, int y); int main() { int m, n; scanf("%d%d", &m, &n); printf("%.10g\n", Cmb(m, n)); return 0; }
好的,以下是递归函数求组合数的代码:
```c
#include <stdio.h>
double Cmb(int x, int y);
int main() {
int m, n;
scanf("%d%d", &m, &n);
printf("%.10g\n", Cmb(m, n));
return 0;
}
double Cmb(int x, int y) {
if (y == 0 || x == y) {
return 1;
} else {
return Cmb(x-1, y-1) + Cmb(x-1, y);
}
}
```
函数 `Cmb` 接收两个非负整数 `x` 和 `y`,并返回组合数 `Cxy`。当 `y` 为 0 或 `x` 等于 `y` 时,直接返回 1,否则递归计算 `C(x-1, y-1)` 和 `C(x-1, y)` 的和。
优化double Cmb(int x, int y) { if (y == 0 || x == y) { return 1; } else { return Cmb(x - 1, y - 1) + Cmb(x - 1, y); }}
这段代码实现了计算组合数的功能,但是存在重复计算的情况,可以使用记忆化搜索来优化。
具体来说,可以使用一个数组来记录已经计算过的值,避免重复计算。代码实现如下:
```
double memo[1005][1005];
double Cmb(int x, int y) {
if (y == 0 || x == y) {
return 1;
} else if (memo[x][y] > 0) {
return memo[x][y];
} else {
memo[x][y] = Cmb(x - 1, y - 1) + Cmb(x - 1, y);
return memo[x][y];
}
}
```
在计算 Cmb(x, y) 时,先判断 memo[x][y] 是否已经计算过,如果是,则直接返回 memo[x][y],否则进行递归计算,并将结果存入 memo 数组中。这样可以避免重复计算,提高计算效率。
阅读全文