洛谷 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
",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
",simp(eps,20,eps,cal(eps,20)));
  return 0;
}
原文地址:https://www.cnblogs.com/Narh/p/10141435.html