C语言求排列组合和阶乘 您所在的位置:网站首页 c语言阶乘怎么算 C语言求排列组合和阶乘

C语言求排列组合和阶乘

2024-01-18 16:15| 来源: 网络整理| 查看: 265

关于C语言求排列数、组合数以及阶乘的实验记录:

一、求排列数和组合数

以下公式中A(n,m)为排列数公式,C(n,m)为组合数公式。

C n m = n ! m ! ( n − m ) ! = A n m m ! = C n − 1 m + C n − 1 m − 1 A n m = n ( n − 1 ) ( n − 2 ) . . . ( n − m + 1 ) = n ! ( n − m ) ! A n m = n ⋅ A n − 1 m − 1 = ( n − m + 1 ) ⋅ A n m − 1 \begin{aligned} &{C}_{n}^{m}=\frac{n!}{m!(n-m)!}=\frac{{A}_{n}^{m}}{m!}={C}_{n-1}^{m}+{C}_{n-1}^{m-1}& \\\\ &{A}_{n}^{m}=n(n-1)(n-2)...(n-m+1)=\frac{n!}{(n-m)!}& \\\\ &{A}_{n}^{m}={n}·{A}_{n-1}^{m-1}={(n-m+1)}·{A}_{n}^{m-1}& \end{aligned} ​Cnm​=m!(n−m)!n!​=m!Anm​​=Cn−1m​+Cn−1m−1​Anm​=n(n−1)(n−2)...(n−m+1)=(n−m)!n!​Anm​=n⋅An−1m−1​=(n−m+1)⋅Anm−1​​​

代码实现: 1.通过阶乘求解: #include double fact(int s) //求阶乘函数,返回s的阶乘 { if (s == 0 || s == 1) return 1; else return s * fact(s - 1); } double C(int n, int m) //通过调用求阶乘函数fact求解组合数A(n,m)的值 { return fact(n) / fact(m) / fact(n - m); } double A(int n, int m) //通过调用求阶乘函数fact求解排列数A(n,m)的值 { return fact(n) / fact(n - m); } int main(void) { int n = 0, m = 0; while (1) { printf("输入自然数n,m(保证n>=m):"); scanf("%d%d", &n, &m); if (n if (m == 0 || m == n) return 1; else return C(n - 1, m) + C(n - 1, m - 1); } double A(int n, int m) //通过递归求解排列A(n,m)的值 { if (m == 0) return 1; else if (m == 1) return n; else return n * A(n - 1, m - 1); //也可以换成: (n - m + 1) * A(n, m - 1); } int main(void) { int n = 0, m = 0; while (1) { printf("输入自然数n,m(保证n>=m):"); scanf("%d%d", &n, &m); if (n double fa = 1; while (s--) fa *= (s + 1); return fa; } 2.通过递归求阶乘: double fact(int s) //求阶乘函数,返回s的阶乘 { if (s == 0 || s == 1) return 1; else return s * fact(s - 1); } 两种方式对比: #include double fact1(int s) //通过循环求阶乘函数,返回s的阶乘 { double fa = 1; while (s--) fa *= (s + 1); return fa; } double fact2(int s) //通过递归求阶乘函数,返回s的阶乘 { if (s == 0 || s == 1) return 1; else return s * fact2(s - 1); } int main(void) { int n = 0; while (1) { printf("输入一个自然数:"); scanf("%d", &n); printf("通过循环求出其阶乘为:\n%.0lf\n\n", fact1(n)); printf("通过递归求出其阶乘为:\n%.0lf\n\n", fact2(n)); } return 0; } 运行结果:

在这里插入图片描述

总结:

从25的阶乘开始,两种方式所计算出的阶乘结果便开始出现精度不足的情况,这是因为double类型数据的精度为15~16位。从图中也可以看到,结果是从 25! 的第17位开始出现差距的,此外,本次实验最多只能计算到170的阶乘,超过之后,便无法通过本程序求得,这是因为double所能表示的数据范围为:-21024 ~ +21024 ,也即-1.79E+308 ~ +1.79E+308。而170的阶乘约为:7.26E+306左右,171的阶乘约为:1.24E+309左右,这已经超出了double类型所能表示的最大值,所以无法求得。 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有