PIPIOJ 1192: PIPI的函数

请求解下面的积分并输出答案:

absinxxdx \int _a^b \frac{sinx}{x}dx

输入

多组输入。
每一个样例包含两个正整数 a,b (0<a<=b<=10)
输出
每一个样例输出一个整形,即积分的答案乘以10000。(精度为 1e-5 ,每次取左端点)

样例输入

1 1
1 2
2 8

样例输出
0
6593
-312
解题思路:

由于absinxxdx\int _a^b \frac{sinx}{x}dx的不定积分无法用初等函数求出。
于是我们可以想到泰勒公式
sinx=xx33!+x55!+(1)nx2n+1(2n+1)!+o(x2n+1) sinx=x-\frac {x^3}{3!}+\frac{x^5}{5!}+(-1)^{n}\frac{x^{2n+1}}{(2n+1)!}+o(x^{2n+1})
从而得到
sinxx=1x23!+x45!+(1)nx2n(2n+1)!+o(x2n) \frac{sinx}{x}=1-\frac {x^2}{3!}+\frac{x^4}{5!}+(-1)^{n}\frac{x^{2n}}{(2n+1)!}+o(x^{2n})
对其积分
sinxxdx=xx33!×3+x55!×5+(1)nx2n+1(2n+1)!×5+o(x2n+1) \int \frac{sinx}{x}dx=x-\frac {x^3}{3!\times3}+\frac{x^5}{5!\times5}+(-1)^{n}\frac{x^{2n+1}}{(2n+1)!\times5}+o(x^{2n+1})
于是我们便可在1e51e^{-5}的精度要求下求出定积分absinxxdx\int_{a}^{b} \frac{sinx}{x}dx

代码实现:
#include <bits/stdc++.h>
using namespace std;
const double eps=1e-5;
double fun(double x){
    double t=x,ans=x;
    int n=1;
    while(fabs(t)>=eps){	//精度要求
        t=(-t*x*x)/((n+1)*(n+2));
        ans+=t/(n+2);
        n+=2;
    }
    return ans;
}
int main(){
    double a,b;
    while(~scanf("%lf%lf",&a,&b)){
        double r1=fun(a),r2=fun(b);	//F(b)-F(a)
        printf("%d\n",(int)((r2-r1)*10000));
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章