C-麦克劳林公式

这是最近上C语言实验的一道非常简单的数学题,也是学校去年的上机考试题

就是给出公式,转换成代码就行了,不过我在课上,真没写出来😥,今早又拿出来仔细复盘,在此记录一下

大概题目

用代码描述上述公式,要求最后一项大于1e-6

我课上写的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
double fun(int x);
int main()
{
int x;
scanf("%d",&x);
printf("%lf",fun(x));
return 0;
}
double fun(int x)
{
double ex=1.0;
int i=1,j=1;
long xn=x;
double temp=xn/(i*1.0);
printf("%lf",1e-6);
while (temp>1e-6)
{
ex+=temp;
i+=(j*j);
j++;
xn*=x;
temp=xn/(i*1.0);
printf("%lf\n",temp);
}
return ex;
}

课上其实有些同学直接去CSDN上copy了(变量都不改,被老师骂了),我其实也去查了下,发现我的思路不也一样嘛,当时老师还提到了阶乘,都给提示了,我还是没想到自己的错误,最后还是没抄别人的代码,交了自己的错误答案上去了(我们的课堂作业和考试都是用FTP交的)

今早在wikipedia搜麦克劳林公式,然后得到这样一幅图

这下我就秒懂我的错误了,分母是阶乘,而不是

1
i+=(j*j);

我理解成 2=1+12,6=2+22,这下压根跳不出循环了,子项是越来越大的 这下吃了数学的亏了,上学期学的公式都忘了,何况这个题目都完全给出了,而俺连题都没读对

修正后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
double fun(int x);
int main()
{
int x;
scanf("%d",&x);
printf("%lf",fun(x));
return 0;
}
double fun(int x)
{
double ex=1.0,i=1.0;
long xn=x;;
int j=1;
double temp=xn/(i*1.0);
while (temp>1e-6)
{
ex+=temp;
j++;
i*=j;
xn*=x;
temp=xn/(i*1.0);
}
return ex;
}

(老师说作为考试的最后一题,最好用函数写,显得高级一点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//人家在CSDN写的
//https://blog.csdn.net/Halo_7777777/article/details/84037720
#include<stdio.h>
int main()
{
const double prec = 1e-6; //定义精确度为1e-6
double term = 1 , sum = 0 , x =0; //每个相加的数为term
double up = 1 , low = 1; // 每个相加的数的分子为up, 分母为low
int i = 1; //i为循环体
printf("Input x = ");
scanf("%lf",&x);
while (term > prec )
{
sum += term ;
up = up * x;
low = low * i ;
term = up / low ;
i++;
}
printf("\n"); // 调整,使布局好看
printf ("e^%.0lf = %lf\n", x,sum) ;
}

另外要注意的,本题作为分母的阶乘不要使用long,更不要用int存,会直接超出范围而溢出,可以用double或者long long,but 机房的VC6.0似乎并没有支持C99的long long,其实在课上我就一直在想是不是这个错误,因为之前写到过不管用哪个类型都会爆掉的,当时可以用科学计数法来存起来,输出也用科学计数法(会损失精度了),不过对这题来说方向完全错了😭

最后发现阶乘其实也挺多搞头的:大数阶乘