一起talk C栗子吧(第三回:C语言实例--求阶乘)

本文讲解了使用C语言实现阶乘计算的方法,包括递归和循环两种方式,并对比了它们的性能差异。


各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例。闲话休提,

言归正转。让我们一起talk C语言实例吧!


看官们,上一回中咱们说的是判断闰年的例子,这一回咱们说的例子是:求阶乘。


看官们,阶乘是数学中的一种运算,通常使用感叹号来表示阶乘。比如:3!表示3的阶乘。阶乘的定义是这

样的:正整数n=0时,n的阶段乘为1,n>0时,n的阶乘为n*(n-1)!。


看官们,我在程序中使用了两种方法来求阶乘。一种是递归方法,另外一种是循环方法。正文中就不写代

码了,详细的代码在我的资源中,大家可以点击链接下载使用。


补充一点:循环和递归是比较常见的方法,所以这里不做过多的说明。不过,在工程中尽量少用递归,一

般情况下,递归可以解决的问题,可以使用循环方法去解决。不推荐递归的理由是因为,递归的性能稍微

差一些,尤其在递归的嵌套比较深的时候。


各位看官,关于求阶乘的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。

```c #include <stdio.h> int main() { int n, i; long long factorial = 1; // 使用 long long 防止阶乘结果溢出 scanf("%d", &n); if (n < 0) { printf("Invalid input\n"); return 0; } for (i = 1; i <= n; i++) { factorial *= i; } printf("%lld\n", factorial); return 0; } ``` ### 解释: 本程序使用循环结构计算从 1 到 n 的阶乘(即 `n! = 1 × 2 × 3 × ... × n`),适用于正整数的阶乘计算。 1. **输入处理**: - 使用 `scanf("%d", &n)` 读取用户输入的整数 `n`。 - 题目隐含要为非负整数(通常 0 ≤ n ≤ 20,因为阶乘增长极快)。 2. **特殊情况说明**: - 若 `n == 0`,根据数学定义,`0! = 1`,循环不会执行,但初始值 `factorial = 1` 正确处理了这一点。 - 若 `n < 0`:负数没有阶乘,输出错误提示 `"Invalid input"`。 3. **循环累乘**: - 使用 `for` 循环从 `i = 1` 到 `n`,将每个 `i` 累乘到 `factorial` 中。 - 初始值设为 1,符合乘法单位元性质。 4. **数据类型选择**: - 使用 `long long` 类型存储阶乘结果,因为它可以表示更大的整数(最大约 9.2×10¹⁸)。 - 普通 `int` 在 n > 12 时就会溢出,`long long` 可安全计算到 `n = 20` 左右。 5. **输出格式**: - 使用 `%lld` 格式符输出 `long long` 类型的值,避免格式不匹配问题。 6. **时间复杂度**:O(n),空间复杂度:O(1),效率高且稳定。 ### 输入/输出示例: **输入样例1**: ``` 5 ``` **输出样例1**: ``` 120 ``` **输入样例2**: ``` 0 ``` **输出样例2**: ``` 1 ``` **输入样例3**: ``` 10 ``` **输出样例3**: ``` 3628800 ``` ### 注意事项: - 当 `n > 20` 时,即使 `long long` 也会溢出,因此建议限制输入范围或使用高精度算法(如数组模拟大数)。 - 本题训练目标是掌握循环结构在累积运算中的应用。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值