精度比较头疼,直接二分法求解即可,先判断是否有解。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define ep(x) p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*x*x+u
int main()
{
double p,q,r,s,t,u;
while(scanf("%lf%lf%lf%lf%lf%lf",&p,&q,&r,&s,&t,&u)!=EOF){
double high=1,low=0,mid;
double fh=ep(high),fl=ep(low),fm;
if(fh*fl>0) {printf("No solution\n");continue;}
while(true){
mid=(high+low)/2;
fm=ep(mid);
if(fabs(fm)<0.000001) break;// 一开始是0.00001,不知道为什么会WA
if(fm*fl>0) {low=mid;fl=ep(mid);}
else {high=mid;fh=ep(mid);}
}
printf("%.4lf\n",(high+low)/2);
}
return 0;
}