声明:因本人为非科班转码,个人水平有限,博客中难免有不准确之处,如有读者发现,本人恳请大家积极指出,本人也想知道自己的错误在哪里。欢迎大家一起指正,共同进步。
- 联系方式:3146367553@qq.com
想直接看结论的小可爱可以直接跳转至3.总结。
目录
1.题目描述
描述:从键盘输入n,计算求1!+2!+......+n!(n>=1)
2.分析
①明确题目要求为求1到n的阶乘和。不难看出,是先求阶乘,再计算和。同时,每个数字的阶乘是不一样的,需要分别独立求出来。
②n!=1*2*3*...*n,阶乘是从1乘以2乘到n为止,每次乘数加1。因此,阶乘求解符合循环,利用for循环求解阶乘
③题目要求是从1!一直加加到n!为止,也符合循环。
那么问题来了,这两个循环什么关系,又该如何敲代码呢?
不要慌,让我细细道来。
我们知道,这个题目的要求是阶乘和,是先求阶乘再求和的。同时,每个阶乘是独立的,可以将题目理解成先计算各个阶乘,再分别相加。因此,两个循环是嵌套的关系。
2.1 代码1(两层循环)
源代码:
#include <stdio.h>
int main()
{
int x = 0;
scanf("%d", &x);
int i = 0;
long long int sum = 0;//记录阶乘和最后结果
for (i=1; i<=x; i++)
{
int j = 0;
long long int ret = 1;//ret存放阶乘
for (j=1; j<=i; j++)
{
ret *= j;
}
sum = sum + ret;
}
printf("结果为%lld\n", sum);
return 0;
}
代码分析:在分析思路里面,我们知道该程序为两层循环。外层循环为求和,内层循环为求阶乘。因此,在外层循环的外面要定义一个sum(用来存放和),每次进行循环都需要把之前的sum加上(如:1!+ 2!,此时已经计算出3!但需要把之前的循环加上)。同时,ret(存放阶乘也是同理),每次计算的是不同数字的阶乘而阶乘为乘积,因此定义long long int ret = 1。最终结果为sum的最终值,即跳出循环的最终值。
注意:阶乘和阶乘和数字可能会特别大,因此用long long int定义。
2.2 代码优化(一层循环)
我们发现,2!= 1!* 2, 3!= 2! * 3,...n!= (n-1)! * n。同时,代码1存在这些重复工作,因为它一直从1开始计算阶乘。同时1!= 1,如此,我们是否可以只用一层循环完成目标?
其实,思路就是:先算1!,然后0+1!,接下来计算2!,然后加上。大致意思就是在计算阶乘的同时加上求和,同时每次求阶乘只需要计算一次。
源代码:
#include <stdio.h>
int main()
{
int x = 0;
scanf("%d", &x);
int i = 0;
long long int sum = 0;//记录阶乘和最后结果
long long int ret = 1;
for (i=1; i<=x; i++)
{
ret *= i;
sum = sum + ret;
}
printf("结果为%lld\n", sum);
return 0;
}
3.总结
该程序为阶乘和,有两种思路。
一:和为外层循环,阶乘为内层循环。定义sum在外层循环外面,定义ret在内层循环外面,外层循环里面,因为计算下一个数字的循环需要从1开始累乘。同时,需要注意定义均为long long int。
二:发现每次求阶乘会有重复的步骤,而2!=1!* 2,3!= 2! * 3,n!= (n-1)!* n,而1!=1,因此每次求循环只需要计算一次。如此,求和和求阶乘可以放在一个循环内部,先求阶乘再求和。
创作不易,小可爱们,动动你们的小手点个赞再走呗。