C-麦克劳林公式
这是最近上C语言实验的一道非常简单的数学题,也是学校去年的上机考试题
就是给出公式,转换成代码就行了,不过我在课上,真没写出来😥,今早又拿出来仔细复盘,在此记录一下
大概题目
用代码描述上述公式,要求最后一项大于1e-6
我课上写的
1 |
|
课上其实有些同学直接去CSDN上copy了(变量都不改,被老师骂了),我其实也去查了下,发现我的思路不也一样嘛,当时老师还提到了阶乘,都给提示了,我还是没想到自己的错误,最后还是没抄别人的代码,交了自己的错误答案上去了(我们的课堂作业和考试都是用FTP交的)
今早在wikipedia搜麦克劳林公式,然后得到这样一幅图
这下我就秒懂我的错误了,分母是阶乘,而不是1
i+=(j*j);
我理解成 2=1+1²,6=2+2²,这下压根跳不出循环了,子项是越来越大的 这下吃了数学的亏了,上学期学的公式都忘了,何况这个题目都完全给出了,而俺连题都没读对
修正后:
1 |
|
(老师说作为考试的最后一题,最好用函数写,显得高级一点)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
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,其实在课上我就一直在想是不是这个错误,因为之前写到过不管用哪个类型都会爆掉的,当时可以用科学计数法来存起来,输出也用科学计数法(会损失精度了),不过对这题来说方向完全错了😭
最后发现阶乘其实也挺多搞头的:大数阶乘