0x07:想破头也没能想出来的简单上课习题
要求:sinx≈x-x^3/3!+x^5/5!+…+最后一项的绝对值小于10的负5次方为止。
先放上成品:
#include <stdio.h> #include <math.h>//提供后面的取绝对值函数使用 int main(void) { int n=1,count=1; double sum,term; double x; printf("Input x:"); scanf("%lf",&x); sum=x; term=x; do{ term=-term*x*x/((n+1)*(n+2)); sum=sum+term; n=n+2; count++;//项数 } while(fabs(term)>=1e-5); printf("sin(x)=%f,count=%d\n",sum,count); return 0; }
写的时候遇到了N个问题,现在一个一个来:
要写的一共就三个空,结果三个空都出现问题了..
首先就是要完成阶乘,这个是唯一一个没有想明白的事,后来经过老师把答案说出来,才恍然大悟,自己写了个demo,发现了这个阶乘可以这么写:(针对本题所要求的的这种阶乘..)
#include <stdio.h> int main() { int n=1,term=1,sum=0; while(term<=100){ term=term*(n+1)*(n+2);//2*3*4*5 n=n+2; sum=term+sum; printf("%d\n",term); } printf("sum=%d\n",sum); }
也就是说,整个程序最关键的部分就在这个term*(n+1)(n+2)这个部分,首先term被赋值为1,第一次就是题里出现的3*2*1(n=1) 后面的5!整好是 5*4*term(n=n+2使得n=3)而此时term是上一次的3*2*1 就变成了5!,完成了分母部分的阶乘。
后面没整明白count是干嘛,后来发现是项数,这个好办,每循环一次出现一项,直接count++,倒也问题不大。
最后
while(fabs(term)>=1e-5);
一开始我直接读书,发现说最后一项要<=1e-5上来就
while(term<=1e-5);
后来醒悟逻辑问题,结果发现,又不对。
经过检查发现又忘记绝对值这件事…
while(fabs(term)>=1e-5);
最后胜利运行。