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;
}
文章图片
这个很简单,一个循环就能解决的事情。还是看看思路,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;
}
看看结果
文章图片
这里算出来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;
}
文章图片
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的阶乘的题目,由此引发了一系列问题,包括一些初学者常见的坑,以及如何简化代码】内容已经详尽的写在正文中了,如有问题或者建议,十分欢迎与我沟通。这里是壮壮的学习博客,感谢大家支持
推荐阅读
- c语言|你能用多少种方法字符串中的字符反向排列,要不看看我的
- c语言|n子棋,你能下赢电脑吗,来玩玩吧
- c语言|c语言初学者对scanf函数难分辨理解的两个点(欢迎补充)
- MySQL|MySQL学习总结
- 算法|基于MATLAB的图像去噪与边缘检测技术
- c语言药店管理系统|药店管理系统(c语言链表实现)
- python全栈开发|进军Python全栈开发--14.Python中的数据结构与算法
- Python学习笔记|21天Python进阶学习挑战赛打卡------第4天(字典)
- CS224W|CS224W-图神经网络 笔记4.3(Community Structure in Networks - 网络中重叠社区的挖掘——BigCLAM 算法)