本身是道简单题,但是因为精度问题卡了半天,以后要注意浮点数计算的时候,尽量减少复杂的浮点运算次数,以免丢失精度。
#include <stdio.h>
#include <math.h>
#define PI (acos(-1.0))
char buffer[100];
int case_count;
double get_r(double b, double h)
{
//printf("b=%lf h=%lf\n", b, h);
double r;
double k, y;
y = sqrt(b*b/4.0+h*h);
k = b/(y*2);
r = k*h/(k+1);
return r;
}
void func(double b, double h)
{
double k, r, sum;
double result;
r = get_r(b, h);
sum = r;
k = r/h;
while(1)
{
h = h-2*r;
r = h*k;
if(r < 0.000001)
break;
sum += r;
}
result = 2*PI*sum;
printf("%13.6lf\n", result);
}
int main(void)
{
double b, h;
int N;
scanf("%d", &N);
case_count = 0;
while(N--)
{
scanf("%lf %lf", &b, &h);
if(++case_count >= 2)
printf("\n");
func(b, h);
}
return 0;
}