Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2418918
  • 博文数量: 392
  • 博客积分: 7040
  • 博客等级: 少将
  • 技术积分: 4138
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-17 13:03
个人简介

范德萨发而为

文章分类

全部博文(392)

文章存档

2017年(5)

2016年(19)

2015年(34)

2014年(14)

2013年(47)

2012年(40)

2011年(51)

2010年(137)

2009年(45)

分类: 嵌入式

2010-01-01 19:56:51

Cylinder
Submit: 623   Accepted:152
Time Limit: 1000MS  Memory Limit: 65535K
Description
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);
    }
}
阅读(752) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~