链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1282
题意:
Solve the equation:
p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0. where 0 <= x <= 1.
p, q, r, s, t and u (where0 <= p,r <= 20 and -20 <= q,s,t <= 0).
思路:注意到每一项的系数的正负,可以判断出每一项都是减函数,则整个函数是个单调减函数。
那么在[0,1]范围内F(x)要想有解,需满足F(0)>=0,F(1)<=0.否则就No sulution.
确定有解后,则用二分法来求近似解。
用二分法的时候,要注意好精度,一是可以通过控制迭代次数来控制,二是通过控制二分的区间长度来控制。
#include<cstdio> #include<cmath> #define F(x) (p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*(x)*(x)+u) const double eps=1e-14; int main() { int p,q,r,s,t,u; while(~scanf("%d%d%d%d%d%d",&p,&q,&r,&s,&t,&u)) { double f0=F(0),f1=F(1); if(f0<-eps || f1>eps) printf("No solution\n"); else { double x=0,y=1,m; while(y-x>1e-7)//控制区间长度 //for(int i=0;i<100;i++)//控制迭代次数 { m=x+(y-x)/2; if(F(m)>0) x=m; else y=m; } printf("%.4lf\n",m); } } return 0; }