C语言入门与进阶 您所在的位置:网站首页 cnk等于n的阶乘 C语言入门与进阶

C语言入门与进阶

#C语言入门与进阶| 来源: 网络整理| 查看: 265

目录 一、问题二、分析三、求解第一种:循环第二种:递归(函数调用自身) 四、进阶第一种:初步进阶版,可以求解 0 fact *= i; } printf("%d\n", fact); return 0; }

测试样例:5

1 * 2 * 3 * 4 * 5 = 120

5 120 -------------------------------- Process exited after 1.475 seconds with return value 0 请按任意键继续. . .

②while循环

#include int main() { int n; scanf("%d", &n); int fact = 1; int i = 1; while (i int n, cnt; scanf("%d", &n); cnt = Fact(n); printf("%d\n", cnt); return 0; } int Fact(int n) //递归函数 { int res = n; if (n > 1) res = res * Fact(n - 1); return res; }

测试样例:7

7 * 6 * 5 * 4 * 3 * 2 * 1 = 1 * 2 * 3 * 4 * 5 * 6 * 7 = 5040

7 5040 -------------------------------- Process exited after 2.563 seconds with return value 0 请按任意键继续. . .

当然也可以写成这样:

2️⃣写法二

#include int Fact(int n) //递归函数 { int res = n; if (n > 1) res = res * Fact(n - 1); return res; } int main() //主函数 { int n, cnt; scanf("%d", &n); cnt = Fact(n); printf("%d\n", cnt); return 0; }

测试样例:6

6 * 5 * 4 * 3 * 2 * 1 = 1 * 2 * 3 * 4 * 5 * 6 = 720

6 720 -------------------------------- Process exited after 1.829 seconds with return value 0 请按任意键继续. . . 四、进阶

为打破上述0 fact *= i; } printf("%lld\n", fact); return 0; }

测试样例:

20 2432902008176640000 -------------------------------- Process exited after 1.529 seconds with return value 0 请按任意键继续. . . 第二种:提高进阶版,可以求解20以上、100甚至更高的阶乘

改进思路:首先,定义一个multiply函数来执行乘法运算。它以一个结果数组、数字位数的指针和一个乘数作为参数。在函数内部,我们借助一个变量carry来跟踪进位,并通过遍历结果数组的每个数字位,将当前位与乘数相乘,并更新结果数组和进位。

接着,我们定义一个fact函数来计算阶乘。它使用一个结果数组来存储阶乘的每一位数字,并初始化为只有一位数字1。然后,通过一个循环从2开始遍历到给定的数字n,每次调用multiply函数将当前数字与结果数组进行乘法运算。

最后,我们逆序打印结果数组的每个数字位,即为阶乘的结果。

#include #define Max_Digits 5000 // 乘法运算,将一个数组与一个乘数相乘,更新结果数组并记录数字位数 void multiply(int result[], int* digits, int multiplier) { int carry = 0; for (int i = 0; i result[*digits] = carry % 10; // 将剩余的进位存储在新的位中 carry /= 10; (*digits)++; // 增加数字位数 } } // 高精度阶乘计算 void fact(int n) { int result[Max_Digits] = { 0 }; // 结果数组,用于存储阶乘的每一位数字 int digits = 1; // 数字的位数,初始为1(只有一位数字1) result[0] = 1; // 初始阶乘结果为1 for (int i = 2; i printf("%d", result[i]); } printf("\n"); } int main() { int n; printf("请输入n的值: "); scanf("%d", &n); printf("%d的阶乘为: ",n); fact(n); return 0; }

★注意:这个高精度实现的阶乘计算,可以处理比较大的n的阶乘的计算。原理是通过乘法运算逐位计算阶乘,将结果存储在一个数组中。但是或许以后会遇到更大的整数和非常大阶乘的时,可能就需要采用更高效的算法或使用更大的整数库,以免数组大小限制以及时间复杂度的过高。

测试样例:

请输入n的值: 100 100的阶乘为: 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 -------------------------------- Process exited after 84.59 seconds with return value 0 请按任意键继续. . .

关于求n的阶乘就先说到这里,希望这篇文章能对你有所帮助!

很感谢你能看到这里,如有相关疑问,还请下方评论留言。 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 如果对大家有帮助的话,希望大家能多多点赞+关注!这样我动力会更足哦! ღ( ´・ᴗ・` )比心



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

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