总是把问题看的太复杂,还以为是三分查找。这题根本没这个必要。
只要使圆周刚好与边相等就行了,矩形中最大的圆就是取最小边作为直径就行了。再分别以两边为高,比较就行了。水啊!
代码:
#include<stdio.h> #include<math.h> #include<algorithm> using namespace std; const double pi=acos(-1.0); int main() { double r,r2,w,h,v1,v2; while(scanf("%lf%lf",&w,&h),w||h) { r=min(h/(2*pi+2),w/2); //选取最小边。 v1=pi*r*r*w; r2=w/(pi*2); v2=pi*r2*r2*(h-2*r2); printf("%.3lf\n",max(v1,v2)); } return 0; } //下面就没必要了。 //int sign(double x) //{ // return x < -eps ? -1 : x > eps; //} /* double search() { double L=0,R=x,dl,dr,vr=0,vr1=0,vl=0,vl1=0,Max; while(sign(R-L)>=0){ double midr=(L+R)/2; double midl=(L+midr)/2; dr=min(midr,b); dl=min(midl,b); if(sign(a-dr*(2*pi+1))>=0) vr=pi*dr*dr*b; if(sign(b-2*pi*dr)>=0) vr1=pi*dr*dr*a; double sum1=max(vr,vr1); if(sign(a-dl*(2*pi+1))>=0) vl=pi*dl*dl*b; if(sign(b-2*pi*dl)>=0) vl1=pi*dl*dl*a; double sum2=max(vl,vl1); if(sign(sum1-sum2)>0){ L=midr+eps; Max=sum1; printf("%0.lf ",Max); } else{ R=midl-eps; Max=sum2; } } printf("%.3lf",L); return Max; }*/