首先求n的阶乘,我们先要产生1-n的数字,然后累乘起来,利用for循环来实现。
所以求n的阶乘的具体代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
scanf_s("%d", &n);//输入n
for (i = 1; i <= n; i++)//产生1-n的数
{
ret = ret*i;//将i累乘赋值给ret
}
printf("%d", ret);
system("pause");
return 0;
}
接下来我们求1!+2!+.....+n!
根据上面的n的阶乘,我们可以构想在for循环的外侧再加入一个for循环即可以产生阶乘的累加。
初步代码实现如下:(假设我们求1.2.3的阶乘累加起来,我们预计的结果是1+2+6=9)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int n = 0;
int num = 0;
int ret = 1;
for (n = 1; n <= 3; n++)//在外面嵌套一层for循环
{
for (i = 1; i <= n; i++)
{
ret = ret*i;
}
num = num + ret;//每次的ret累加给num
}
printf("%d\n", num);
system("pause");
return 0;
}
但最终运行的结果如下:
运行的结果是15,并不是我们预计的9,所以对代码进行调试发现ret在不断循环中发生了改变。所以我们需要在每次开始循环之前需要对ret重新赋值为1。
修改的代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int n = 0;
int num = 0;
int ret = 1;
for (n = 1; n <= 3; n++)
{
ret = 1;//在循环之前将ret赋值为1
for (i = 1; i <= n; i++)
{
ret = ret*i;
}
num = num + ret;
}
printf("%d\n", num);
system("pause");
return 0;
}
这样改动之后的代码的结果就正确了,为9。
在写完这段代码之后,发现这段代码还可以进行简化,所以我们使用一个for循环就可以实现。思路可以理解为1的阶乘乘2就是2的阶乘,2的阶乘乘3就是3的阶乘,把每一次的阶乘结果相加就是n的阶乘。
所以最终优化的代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int n = 0;
int num = 0;
int ret = 1;
for (n = 1; n <= 3; n++)
{
ret = ret*n;//求出每一个数的阶乘
num = num + ret;//累加给num
}
printf("%d\n", num);
system("pause");
return 0;
}