一、前言
之前我们学习到了n的阶乘是如何使用c语言实现,今天让我们来看看如何使用c语言实现n阶乘的累加,之前我们使用for循环实现阶乘,那么我们在它的基础上进行一个优化,进行一个for循环的嵌套,来完成n阶乘的累加。
二、我们来做一道题吧。
题目描述:
杰克又又又在做数学题了,这次他对之前使用c语言编写n的阶乘的程序有了更深一步的思考,我是不是可以去使用c语言进行n阶乘的累加呢,请你帮助杰克,使用c语言实现从1到10的阶乘的累加。
输入描述:
无
输出描述:
一行,输出1到10阶乘累加的和
三、题目分析
在这道题中,表明了我们需要进行一个n阶乘的累加,这个n值为10,我们参考之前写的计算n阶乘的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 1;
int n = 1;
int ret=1;
scanf("%d", &n);
for (i = 1;i <= n;i++)
{
ret = ret*i;
}
printf("您的计算结果是:%d", ret);
return 0;
}
这是n阶乘的代码,我们来对这个代码进行改进,实现n阶乘的累加
四、代码展示
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 1, n = 1, ret = 1;
int sum=0;
//从1的阶乘开始计算
for (n = 1;n <= 10;n++)
{
ret = 1;
//计算阶乘并将得到的阶乘数累加
for (i = 1;i <= n;i++)
{
ret = ret * i;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
五、代码分析
这是对之前代码进行修改之后得到的10阶乘的累加,拿出之前的代码,我们这里的代码作用是计算n的阶乘,但是我们需要求的是n阶乘的累加,那么这里我们需要嵌套一个for循环,这个for循环的作用是改变n的值使阶乘递增,我们就设置这个变量为n,开始循环,在循环的过程中我们发现,缺少一个可以存放每次阶乘运算之后结果的和,那我们定义一个sum来存放,初始化为0,好啦,这里程序是不是差不多了,我们运行一下,但是很可惜,这里会出错,程序不会报错,但是会输出一个很大的值,博主在第一次写的时候也是想了好久,这里有一点需要注意。
我们对程序进行修改使n=5,正常来说n的阶乘是5的话输出是120,累加再怎么加也不会是34863这么大的值,所以程序是有问题的,我们通过调试发现,是ret没有初始化的问题。
六、对ret的初始化
我们发现程序的问题是ret没有初始化导致的上一次ret的值还留在ret中,残留的数据继续进行运算导致的运算结果出错,那么我们这里发现问题就解决他,我们在外层for循环的位置对ret进行初始化,值为1,这样我们每次计算阶乘的时候都会重新从1开始阶乘的运算,解决了这个问题我们再次运行程序。
运行结果:
最后计算出的结果是4037913,与计算器计算的结果一致,这里我们就算是完成了所有的运算。
七、代码优化
那么这个for循环的嵌套好长啊,要使用两个for循环,我们有没有什么更简化的方式可以计算出n阶乘的累加呢,哎,这里还真有,话不多说,上代码
代码展示:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 1, n = 1, ret = 1;
int sum=0;
for (n = 1;n <= 10;n++)//算法优化
{
ret = ret * n;
sum = sum + ret;
}
printf("%d\n", sum);
return 0;
}
这里我们只使用了一个for循环就完成了代码的运算,结果与之前是一模一样,在这段代码中,我们每次计算一个阶乘之后,求和一次,n每次递增的时候都乘之前数的阶乘结果来进行阶乘的递增,这么说可能有些绕口,就是我们不用像之前的代码对ret初始化,我们保留之前ret中上一次阶乘的值,比如,之前ret中是3的阶乘,那么现在n是4,我们使用4去乘3的阶乘就得到了4的阶乘,之后我们将计算出4的阶乘的结果加到sum中,完成了我们计算阶乘和累加的过程。
这样这个代码是不是看起来简洁多了。
好啦,我们今天到这里就结束喽,希望大家也可以学习到新的知识呢,共勉!