学习了循环碰到了编写计算n的阶乘的题目,由此引发了一系列问题,包括一些初学者常见的坑,以及如何简化代码

1.计算n的阶乘
2.计算1!+2!+3!…+n!

1 计算n的阶乘

#include <stdio.h>

int main()
{
	//输入
	int n = 0;
	scanf("%d", &n);
	//产生1~n的数字
	int i = 0;
	int ret = 1;
	for (i = 1; i <= n; i++)
	{
		ret = ret * i;
	}
	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述
这个很简单,一个循环就能解决的事情。还是看看思路,n的阶乘(这里拿3举例)3的阶乘就是123 ,咱给个循环,产生1到3的数,然后乘到自己定义的变量ret里(注意这里ret的初值只能设置为1,初值若是0,则任何数乘过去都是0了,懂吧)

2 计算1!+2!+3!…+n!

2.1 看看藏着坑的代码

#include <stdio.h>

int main()
{
	//输入
	int n = 0;
	scanf("%d", &n);
	
	int i = 0;
	int ret = 1;
	int sum = 0;
	int j = 0;
	for (j = 1; j <= n; j++)
	{
		for (i = 1; i <= j; i++)
		{
			ret = ret * i;
		}
		sum = sum + ret;
	}

	printf("%d\n", sum);
	return 0;
}

看看结果
在这里插入图片描述
这里算出来1到3的阶乘之和为15,,但实际上应该是9.原因是啥呢?许多人是通过上面第一小问的结果,直接简单粗暴的在外头套一个循环把他们加起来。但是问题所在呢,就是 在内层循环进行一次的时候,在进入之时ret为初始化成1,导致在算3的阶乘的时候,ret初值为2,因此导致了错误

2.2 指出坑,并且给出正确的代码

#include <stdio.h>

int main()
{
	//输入
	int n = 0;
	scanf("%d", &n);

	int i = 0;
	int ret = 1;
	int sum = 0;
	int j = 0;
	for (j = 1; j <= n; j++)
	{
		ret = 1;//解决方法就是加了这一句话!!!
		for (i = 1; i <= j; i++)
		{
			ret = ret * i;
		}
		sum = sum + ret;
	}

	printf("%d\n", sum);
	return 0;
}

在这里插入图片描述

2.3 代码简化

先上简化代码哈


#include <stdio.h>

int main()
{
	//输入
	int n = 0;
	scanf("%d", &n);

	int ret = 1;
	int sum = 0;
	int j = 0;
	for (j = 1; j <= n; j++)
	{
		ret = ret * j;
		sum = sum + ret;
	}

	printf("%d\n", sum);
	return 0;
}

仔细观察2.2的代码,会发现这两重循环中,重复计算了好多东西,因此在简化的代码中,可以进行调整。
这里举例辅助理解一下,在计算完1的阶乘之后,2的阶乘只需要在1的阶乘的基础上乘上2就行,以此类推,3的阶乘就是2的阶乘的结果乘上3.因此舍掉一个循环之后,代码效率大有提升

3小结

内容已经详尽的写在正文中了,如有问题或者建议,十分欢迎与我沟通。这里是壮壮的学习博客,感谢大家支持

猜你喜欢

转载自blog.csdn.net/qq_67838572/article/details/125941213