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);

 

最后胜利运行。

Tips:鼠标经过代码时会出现工具栏,工具栏上方有一键复制代码的功能哦~天云网络培训,专注于网络空间安全相关培训,并提供相关课程的在线培训 报名微信 tyedu1
天云网络培训 » 0x07:想破头也没能想出来的简单上课习题

提供专业、易懂、平民化教育。让每个热爱网络的人有个归宿

立即查看 了解详情