有关阶乘
求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=ret2=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
写在最后
为什么厉害的人那么多,今天这个搞得我头很大。
为什么优化的算法想不出来,又或者明明知道有问题,就是找不出问题在哪。真的脑子里面没有这个体系啊。
并且我真的觉的越来越难了,原来的二个半小时结束的时候就能消化的差不多,今天真的搞不完了,消化的太慢了。
哎,这个路一点都不好走。
手边还有四个程序题没有弄现在十点多了,从六点多到现在真的好累啊。
明天早上起立接着干。慢慢来,总会看到成果的。
除了对自己说声加油 没别的说的了。
今天还有消息说要延迟开学,既然在家里,就好好把握在家的时间吧。总不能真的一天天玩过去。