UVA 10522 Height to Area(已知三角形三高求面积)
题意:
给你一个三角形的三条高的长度,要你求出该三角形的面积. 可能存在非法输入.
分析:
设三角形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;
}