uva10341 - Solve It
我的代码从1e-4一直改到1e-7,才AC掉,
原因其实很简单,printf的取值是按照四舍五入原则的,
举个例子,假如最后的区间为(0.9994,0.9995),那么第5位小数位上的数就至关重要了,无巧不成书的话,第5位小数为4,那么第六位小数又至关重要了,如小于等于4的话,那么最后的结果是0,9994,如果大于等于5的话,那么最后的结果就变成了0.9995了。所以,我们以后做这样的题目的时候要多向后精确3位或者更多。。。
代码如下:
#include <cstdio> #include <cmath> int p, q, r, s, t, u; double ans(double x) { return p*exp(-1*x) + q*sin(x) + r*cos(x) + s*tan(x) + t*x*x + u; } int main () { while(scanf("%d%d%d%d%d%d",&p,&q,&r,&s,&t,&u)!=EOF) { if(ans(1)>0||ans(0)<0) {puts("No solution"); continue; } double l = 0, r = 1, m; while(r-l>1e-7) { m = (l+r)/2; if(ans(m)<=0) r = m; else l = m; } printf("%.4lf\n",l); } return 0; }