dreamzk每天上学时都会带上一个水杯去,他的水杯是一个半径为R高为L的圆柱形的,杯子里存有一定量的水,水面到底面的高度为H , 现把这个杯子倒过来并且水平放置<如图> ,dreamzk想计算出水平放置后水面的高度h,想请你帮帮他。
Input
多个测试用例,每个测试用例一行每行输入3个浮点数 0 < R <= 100.0 , 0 < L <= 100.0 , 0 <= H <= L
Output
对应每个测试用例输出一行h保留3位小数。
输出格式见Sample Output
Sample Input
5.000000 10.000000 5.000000
83.985632 15.216697 5.929504
Sample Output
Case 1:
5.000
Case 2:
69.356
做的不多的图形计算的题:
最开始以为这个题是要做积分!!
下面的思路是一个二分查找,无限逼近所求面积的一种方法,需要控制好精度。
所求的面积用圆面积减去三角形的面积就OK了。
三角形面积公式(高数的东西都忘了~~~还得花时间补补)
S = 1/2 * a * b * sin(alpha). alpha是a,b两边之间的夹角!
#include
#include
#include
#define PI acos(-1)
#define EXPS 1e-6
double R, L, H;
double cal_area(double y)
{
double alpha, area;
if (y < R)
{
alpha = acos((R - y) / R);
area = alpha * R * R - 0.5 * R * R * sin(2.0 * alpha);
}
else
{
alpha = acos((y - R) / R);
area = PI * R * R - (alpha * R * R - 0.5 * R * R * sin(2.0 * alpha));
}
return area;
}
int main(int argc, char *argv[])
{
double v, s, high, low, mid, area;
int i = 1;
while (EOF != scanf("%lf %lf %lf", &R, &L, &H))
{
v = PI * R * R * H;
s = v / (double)L;
high = 2.0 * R;
low = 0;
while (1)
{
mid = (high + low) / 2.0;
area = cal_area(mid);
if (fabs(area - s) <= EXPS) /*满足这个精度就认为是相等了*/
break;
if (area > s) /* 二分之 */
high = mid;
else
low = mid;
}
printf("Case %d:\n%.3lf\n", i++, mid);
}
}