代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long double dl;
dl ansl,ansr;
map <dl,dl> vis; //一个小优化,没有多大作用
dl cal(dl n) //计算f(n)的函数值
{
if(vis[n])
return vis[n];
return vis[n]=((pow(2.0,n))+(3.0*n)-6.0);
}
void solve(dl l,dl r,dl exp)//当前二分区间及精度
{
if(r-l<exp) //区间长度小于给定精度
{
ansl=l,ansr=r;
return;
}
dl mid=(l+r)/2;
dl a=cal(l),b=cal(r),c=cal(mid);
if(c==0) //区间中点就是零点
solve(mid,mid,exp);
if(a*c<0) //零点位于左半区间
solve(l,mid,exp);
if(b*c<0)
solve(mid,r,exp); //零点位于右半区间
return;
}
int main(int argc, char const *argv[])
{
vis.clear();
dl a,b,exp;
cin>>a>>b>>exp;
solve(a,b,exp);
cout<<fixed<<setprecision(10)<<ansl<<" "<<ansr<<endl;//强行精度控制
return 0;
}