`
阿尔萨斯
  • 浏览: 4150200 次
社区版块
存档分类
最新评论

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

 
阅读更多

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==0y==0z==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;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics