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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章