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);
最后胜利运行。