总是把问题看的太复杂,还以为是三分查找。这题根本没这个必要。
只要使圆周刚好与边相等就行了,矩形中最大的圆就是取最小边作为直径就行了。再分别以两边为高,比较就行了。水啊!
代码:
#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;
}*/