第一种方法:双重for循环
使用双重for循环的时候,外层循环的目的是阶乘之间的相加运算,内层循环的目的是计算各自的阶乘
但是这样的代码会很容易出现一个问题。
#include<stdio.h>
int main()
{
int i = 0;
int set = 1;
int n = 0;
int sum = 0;
for (n = 1; n <= 3; n++)
{
for (i = 1; i <= n; i++)
{
set = set * i;
}
sum = sum + set;
}
printf("%d\n", sum);
return 0;
}
- 正常应该是9,但是确输出了15,为什么呢?
原因分析
其实原因就是出现在了内层循环的set,因为在这个代码当中,set没有赋值操作,也就是每次循环之后set的值都会增加,但是外层开始第二次循环时,内层的set应该从1开始才是正确的。所以应该加入一个set重新赋值1的操作。
#include<stdio.h>
int main()
{
int i = 0;
int set = 1;
int n = 0;
int sum = 0;
for (n = 1; n <= 5; n++)//阶乘之间的求和
{
for (i = 1; i <= n; i++)//输出各自的阶乘
{
set = set * i;
}
sum = sum + set;
set = 1;//重新为ret赋值
}
printf("%d\n", sum);
return 0;
}
第二种方法:使用数学知识优化代码
- 4!= 3!*4
- 5!= 4!*5
通过上述的数学知识可知,一个数字的阶乘就是上一个数字的阶乘*数字本身,那么我们就可以设置一个变量,直接在一个循环当中把所有出现过的阶乘全部加在一起,具体操作如下:
- 此时的set不需要重新赋值,而是直接为上一次的运算结果
#include<stdio.h>
int main()
{
int i = 0;
int set = 1;
int n = 0;
int sum = 0;
scanf("%d", &n);
//循环产生1--n的数字
for (i = 1; i <= n; i++)
{
set = set * i;
sum = sum + set;
}
printf("%d\n", sum);
return 0;
}