自适应辛普森积分

学习博客:https://www.cnblogs.com/Miracevin/p/10774831.html

#include<bits/stdc++.h>

typedef double db;
// https://www.luogu.com.cn/problem/P4525 
db a,b,c,d,l,r;

inline db readb()
{   
    int f=1;db x=0;char s=getchar();
    for( ;!isdigit(s);s=='-' && (f=-1),s=getchar());
    for( ;isdigit(s);x=x*10+s-48,s=getchar());
    if( s=='.' ) for( db l=0.1,s=getchar();isdigit(s);x=x+(s-48)*l,l/=10,s=getchar() );
    return x*f;
}

inline db f( db x ) // 在[l,r] 定积分收敛的函数 
{
    return (c*x+d)/(a*x+b); // 函数  注意运算出现 0^5--- nan 
}

inline db simpson( db l,db r ) //Simpson公式
{
    db mid=(l+r)/2;
    return ( f(l)+4*f(mid)+f(r) )*(r-l)/6;
}

db asr( db l, db r,db eps ,db ans )
{
    db mid=(l+r)/2;
    db ls=simpson(l,mid),rs=simpson(mid,r);
    if( fabs(ls+rs-ans)<=15*eps ) return ls+rs+(ls+rs-ans)/15; //确认精度
    return asr(l,mid,eps/2,ls)+asr(mid,r,eps/2,rs);   //精度不够则递归调用
}

inline db asr( db l,db r,db eps ) { return asr(l,r,eps,simpson(l,r)) ; }

int main()
{
    a=readb(),b=readb(),c=readb(),d=readb();
    l=readb(),r=readb();

    db ans=asr(l,r,1e-6); 
    printf("%.6lf\n",ans);
}
全部评论

相关推荐

牛客773130651号:巨佬,简历模板换成上下的,左右的很烦,hr看着不爽。。。科大随便乱杀,建议能保研就保研,不行也得考一下 ,985硕去干算法,比开发强多了。开发许多双非都能搞,学历优势用不上,算法有门槛
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务