有关阶乘

有关阶乘

求n的阶乘

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i = 0;
	int n = 0;
	int ret = 1; //ret 表示阶乘
	scanf("%d", &n);

	for(i = 1;i <=n; i++)
	{
		ret = ret*i;
	}
	printf("ret=%d\n", ret); 
	
    system("pause");
	return 0;
}

ret = ret*i; 这条语句至关重要

求1!+2!+3!+…+n!

代码1

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 0;
	int n = 0;
	int sum = 0;
	int j = 0;
	int ret = 1; //ret 表示阶乘
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		ret = 1;
		for (j = 1; j<= i; j++)
		{
			ret = ret*j;
		}
		sum+=ret;
	}
     system("pause");
	return 0;
}

思路说明
for(i = 1;i <=n; i++)
{
ret = ret*i;
}
由第一个获得的思路 既然此代码块可以求阶乘
那么要求1!+2!+3!+…+n! 就让==条件里的n是可以从1到n变动的 ==因此想到了再加一层for循环
for (i = 1; i <= n; i++)
{
ret = 1;
for (j = 1; j<= i; j++)
{
ret = ret *j;
}
sum+=ret;
}
在写代码的错误
缺少了 ret = 1;这一个条件
每次开始一个新的循环之前如果不初始化ret 就会使得ret从上一次的值一直累乘。

如果此时输入n=3;
例如1!运行后
i=1
ret=1 sum=1
i=2
j=1 ret =ret1=1;
j=2 ret=ret
2=2; sum=3
i=3
j=1 ret =ret * 1=2; //错误点
j=2 ret =ret * 2=4;
j=3 ret =ret * 3=12; sum=15
未对ret进行初始化 令ret=1

for (i = 1; i <= n; i++)
	{
		//ret = 1;
		for (j = 1; j<= i; j++)
		{
			ret = ret*j;
		}
		sum+=ret;
	}

代码2 对代码1 的优化

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
   for (j = 1; j <= n; j++)
	{
		ret = ret*j;
		sum += ret;
	}
	printf("sum=%d\n", sum);
   system("pause");
	return 0;
}

代码1 的问题
从上面可以看出
不论n 等于几 都要从1开始累乘 一步一步 事实上这加大了运算量

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

而此种改进方法
利用的是n!=n*(n-1)!

直接在前一步运算的基础上对 ret*n
简化了计算量。

详细解释

例如1!运行后ret=1 sum=1
n=2
j=1 ret=1
j=2 ret=ret * 2=2; sum=1+2=3
n=3 j=1 ret =ret * 1=1; sum=1
j=2 ret =ret * 2=2; sum=1+2=3
j=3 ret =ret * 3=6; sum=1+2+6=9

写在最后

为什么厉害的人那么多,今天这个搞得我头很大。
为什么优化的算法想不出来,又或者明明知道有问题,就是找不出问题在哪。真的脑子里面没有这个体系啊。

并且我真的觉的越来越难了,原来的二个半小时结束的时候就能消化的差不多,今天真的搞不完了,消化的太慢了。
哎,这个路一点都不好走。

手边还有四个程序题没有弄现在十点多了,从六点多到现在真的好累啊。
明天早上起立接着干。慢慢来,总会看到成果的。

除了对自己说声加油 没别的说的了。
今天还有消息说要延迟开学,既然在家里,就好好把握在家的时间吧。总不能真的一天天玩过去。

发布了22 篇原创文章 · 获赞 5 · 访问量 3211

猜你喜欢

转载自blog.csdn.net/weixin_45271990/article/details/104255432