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; }