You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断给定边长的三角形的三条高能否构成新三角形?

问题分析与优化方案

首先明确核心逻辑:设三角形三边为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_c
  • h_a + h_c > h_b
  • h_b + h_c > h_a

代入h=2S/边长,两边同时除以2S(正数,不改变不等号方向),得到:

  • 1/a + 1/b > 1/c
  • 1/a + 1/c > 1/b
  • 1/b + 1/c > 1/a

进一步交叉相乘(均为正数,不等号方向不变),转化为整数运算:

  • c*(a+b) > a*b
  • b*(a+c) > a*c
  • a*(b+c) > b*c

额外前提判断

输入的a,b,c必须首先是合法的三角形三边,即满足:

  • a+b > c
  • a+c > b
  • b+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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:55:38