这是最近上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搜麦克劳林公式,然后得到这样一幅图
这下我就秒懂我的错误了,分母是阶乘,而不是
我理解成 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
|
#include<stdio.h> int main() { const double prec = 1e-6; double term = 1 , sum = 0 , x =0; double up = 1 , low = 1; int i = 1; 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,其实在课上我就一直在想是不是这个错误,因为之前写到过不管用哪个类型都会爆掉的,当时可以用科学计数法来存起来,输出也用科学计数法(会损失精度了),不过对这题来说方向完全错了😭
最后发现阶乘其实也挺多搞头的:大数阶乘