c语言|学习了循环碰到了编写计算n的阶乘的题目,由此引发了一系列问题,包括一些初学者常见的坑,以及如何简化代码

1.计算n的阶乘
2.计算1!+2!+3!…+n!
1 计算n的阶乘

#include int main() { //输入 int n = 0; scanf("%d", &n); //产生1~n的数字 int i = 0; int ret = 1; for (i = 1; i <= n; i++) { ret = ret * i; } printf("%d\n", ret); return 0; }

c语言|学习了循环碰到了编写计算n的阶乘的题目,由此引发了一系列问题,包括一些初学者常见的坑,以及如何简化代码
文章图片

这个很简单,一个循环就能解决的事情。还是看看思路,n的阶乘(这里拿3举例)3的阶乘就是123 ,咱给个循环,产生1到3的数,然后乘到自己定义的变量ret里(注意这里ret的初值只能设置为1,初值若是0,则任何数乘过去都是0了,懂吧)
2 计算1!+2!+3!…+n! 2.1 看看藏着坑的代码
#include int main() { //输入 int n = 0; scanf("%d", &n); int i = 0; int ret = 1; int sum = 0; int j = 0; for (j = 1; j <= n; j++) { for (i = 1; i <= j; i++) { ret = ret * i; } sum = sum + ret; } printf("%d\n", sum); return 0; }

看看结果
c语言|学习了循环碰到了编写计算n的阶乘的题目,由此引发了一系列问题,包括一些初学者常见的坑,以及如何简化代码
文章图片

这里算出来1到3的阶乘之和为15,,但实际上应该是9.原因是啥呢?许多人是通过上面第一小问的结果,直接简单粗暴的在外头套一个循环把他们加起来。但是问题所在呢,就是 在内层循环进行一次的时候,在进入之时ret为初始化成1,导致在算3的阶乘的时候,ret初值为2,因此导致了错误
2.2 指出坑,并且给出正确的代码
#include int main() { //输入 int n = 0; scanf("%d", &n); int i = 0; int ret = 1; int sum = 0; int j = 0; for (j = 1; j <= n; j++) { ret = 1; //解决方法就是加了这一句话!!! for (i = 1; i <= j; i++) { ret = ret * i; } sum = sum + ret; } printf("%d\n", sum); return 0; }

c语言|学习了循环碰到了编写计算n的阶乘的题目,由此引发了一系列问题,包括一些初学者常见的坑,以及如何简化代码
文章图片

2.3 代码简化 先上简化代码哈
#include int main() { //输入 int n = 0; scanf("%d", &n); int ret = 1; int sum = 0; int j = 0; for (j = 1; j <= n; j++) { ret = ret * j; sum = sum + ret; } printf("%d\n", sum); return 0; }

仔细观察2.2的代码,会发现这两重循环中,重复计算了好多东西,因此在简化的代码中,可以进行调整。
这里举例辅助理解一下,在计算完1的阶乘之后,2的阶乘只需要在1的阶乘的基础上乘上2就行,以此类推,3的阶乘就是2的阶乘的结果乘上3.因此舍掉一个循环之后,代码效率大有提升
3小结 【c语言|学习了循环碰到了编写计算n的阶乘的题目,由此引发了一系列问题,包括一些初学者常见的坑,以及如何简化代码】内容已经详尽的写在正文中了,如有问题或者建议,十分欢迎与我沟通。这里是壮壮的学习博客,感谢大家支持

    推荐阅读