洛谷 4525 && 洛谷 4526 【模板】自适应辛普森法
题目:https://www.luogu.org/problemnew/show/P4525
https://www.luogu.org/problemnew/show/P4526
参考:https://blog.csdn.net/VictoryCzt/article/details/80660113
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define db double using namespace std; db L,R,a,b,c,d; db f(db x){return (c*x+d)/(a*x+b);} db cal(db l,db r){return (f(l)+4*f((l+r)/2)+f(r))*(r-l)/6;} db simp(db l,db r,db eps,db ret) { db mid=(l+r)/2,vl=cal(l,mid),vr=cal(mid,r); if(fabs(vl+vr-ret)<=eps)return ret; return simp(l,mid,eps/2,vl)+simp(mid,r,eps/2,vr); } int main() { scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&L,&R); printf("%.6f\n",simp(L,R,1e-8,cal(L,R))); return 0; }
第二题就直接看了看题解……函数积到20就可以了,后面趋于0;不能从0开始积,因为 x 在分母。那个幂调用 pow( ) 就行了。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define db double using namespace std; const db eps=1e-6; db a; db f(db x){return pow(x,a/x-x);} db cal(db l,db r){return (f(l)+4*f((l+r)/2)+f(r))*(r-l)/6;} db simp(db l,db r,db eps,db ret) { db mid=(l+r)/2,vl=cal(l,mid),vr=cal(mid,r); if(fabs(vl+vr-ret)<=eps)return ret; return simp(l,mid,eps/2,vl)+simp(mid,r,eps/2,vr); } int main() { scanf("%lf",&a); if(a<0)puts("orz"); else printf("%.5f\n",simp(eps,20,eps,cal(eps,20))); return 0; }