5.编写求n!的西数f(intn),在主函数中输入两个整数m、n,然后调用 函数求: m! C" 'm n! (m - n)! 【注意,两数f的类型应用long或double。
时间: 2024-03-23 18:39:54 浏览: 70
下面是使用long类型的代码,可以计算比较小的n和m的阶乘和组合数:
```c
#include <stdio.h>
long factorial(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factorial(n-1);
}
}
long combination(int m, int n) {
return factorial(m) / (factorial(n) * factorial(m-n));
}
int main() {
int m, n;
printf("请输入两个整数m和n:");
scanf("%d %d", &m, &n);
printf("%d! = %ld\n", m, factorial(m));
printf("%d! = %ld\n", n, factorial(n));
printf("(%d,%d) = %ld\n", m, n, combination(m, n));
return 0;
}
```
如果要计算比较大的n和m的阶乘和组合数,可以使用double类型,并且需要注意double类型的精度问题。可以使用数学库中的lgamma函数来计算阶乘的对数,从而避免阶乘过大导致计算机无法处理的问题。下面是使用double类型的代码:
```c
#include <stdio.h>
#include <math.h>
double factorial(int n) {
if (n == 0 || n == 1) {
return 0;
} else {
return lgamma(n+1);
}
}
double combination(int m, int n) {
return exp(factorial(m) - factorial(n) - factorial(m-n));
}
int main() {
int m, n;
printf("请输入两个整数m和n:");
scanf("%d %d", &m, &n);
printf("%d! = %.0f\n", m, exp(factorial(m)));
printf("%d! = %.0f\n", n, exp(factorial(n)));
printf("(%d,%d) = %.0f\n", m, n, combination(m, n));
return 0;
}
```
阅读全文