如何判断给定边长的三角形的三条高能否构成新三角形?
问题分析与优化方案
首先明确核心逻辑:设三角形三边为a,b,c,对应高为h_a,h_b,h_c。由面积相等可得h_a=2S/a、h_b=2S/b、h_c=2S/c(S为三角形面积)。要判断三条高能构成三角形,需满足任意两边之和大于第三边,代入高的表达式后可转化为纯整数运算条件,彻底避免浮点精度误差。
关键转化推导
将高的三边关系:
h_a + h_b > h_ch_a + h_c > h_bh_b + h_c > h_a
代入h=2S/边长,两边同时除以2S(正数,不改变不等号方向),得到:
1/a + 1/b > 1/c1/a + 1/c > 1/b1/b + 1/c > 1/a
进一步交叉相乘(均为正数,不等号方向不变),转化为整数运算:
c*(a+b) > a*bb*(a+c) > a*ca*(b+c) > b*c
额外前提判断
输入的a,b,c必须首先是合法的三角形三边,即满足:
a+b > ca+c > bb+c > a
否则三条高不存在,直接返回不能构成三角形。
优化后的C++代码
#include <iostream> using namespace std; int main() { long long a, b, c; cin >> a >> b >> c; // 先验证原三边是否为合法三角形 if (a + b <= c || a + c <= b || b + c <= a) { cout << "NO" << endl; return 0; } // 判断高能否构成三角形的整数运算条件 bool cond1 = c * (a + b) > a * b; bool cond2 = b * (a + c) > a * c; bool cond3 = a * (b + c) > b * c; cout << (cond1 && cond2 && cond3 ? "YES" : "NO") << endl; return 0; }
错误原因说明
你之前的代码大概率是直接计算高的浮点值(如double类型)进行比较,当边长较大时,浮点数精度丢失会导致判断错误。改用整数运算后完全规避了精度问题,同时使用long long类型防止大整数相乘时的溢出。
内容的提问来源于stack exchange,提问作者Nurgalinchik
相关产品推荐
相关产品推荐

