C语言 计算 1!+2!+3!+……+10!

第一种方法:双重for循环

使用双重for循环的时候,外层循环的目的是阶乘之间的相加运算,内层循环的目的是计算各自的阶乘

但是这样的代码会很容易出现一个问题。

#include
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
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;
}

 

第二种方法:使用数学知识优化代码

  1.     4!= 3!*4
  2.     5!= 4!*5

通过上述的数学知识可知,一个数字的阶乘就是上一个数字的阶乘*数字本身,那么我们就可以设置一个变量,直接在一个循环当中把所有出现过的阶乘全部加在一起,具体操作如下:

  • 此时的set不需要重新赋值,而是直接为上一次的运算结果
#include
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;
}

你可能感兴趣的:(C语言刷题,算法)