您的位置:首页 > 其它

UVA 10522 Height to Area(已知三角形三高求面积)

2014-09-21 15:05 429 查看
UVA 10522 Height to Area(已知三角形三高求面积)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=17&page=show_problem&problem=1463
题意:

给你一个三角形的三条高的长度,要你求出该三角形的面积. 可能存在非法输入.

分析:

设三角形ABC的三边长为a,b,c,对应的三条高长为x,y,z.且该三角形面积为S. 那么有下面等式:

S=1/2*a*x = 1/2*b*y = 1/2*c*z

可得

a=2*S/x

b=2*S/y

c=2*S/z

令p=(a+b+c)/2=S(1/x+1/y+1/z),那么由海伦公式有S=
根号(
p*(p-a)*(p-b)*(p-c)
)

将a,b,c的值带入海伦公式中令

val=(1/x+1/y+1/z)*(-1/x+1/y+1/z)*(1/x-1/y+1/z)*(1/x+1/y-1/z)可得:

S=1/根号(val)

那么什么时候的输入是非法的呢?
当(x==0或y==0或z==0)或val<=0时,输入非法.


AC代码:

#include<cstdio>
#include<cmath>
using namespace std;
const double eps=1e-10;
int dcmp(double x)
{
    if(fabs(x)<eps) return 0;
    return x<0?-1:1;
}
int main()
{
    int n; scanf("%d",&n);
    while(n)
    {
        double x,y,z;
        scanf("%lf%lf%lf",&x,&y,&z);
        if(dcmp(x)==0 || dcmp(y)==0 || dcmp(z)==0)
        {
            printf("These are invalid inputs!\n");
            --n;
            continue;
        }
        double val=(1/x+1/y+1/z)*(-1/x+1/y+1/z)*(1/x-1/y+1/z)*(1/x+1/y-1/z);
        if(dcmp(val)<=0)
        {
            printf("These are invalid inputs!\n");
            --n;
            continue;
        }
        else printf("%.3lf\n",1/sqrt(val));
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: