题解:学而思编程 三角形类型

【题目来源】

学而思编程:三角形类型

【题目描述】

读取表示三角形三条边的 \(3\) 个正整数 \(A\)\(B\)\(C\) 并按降序排列,使 \(A\) 边是三边中最大的一边。

接下来,根据以下情况,确定它们可以组成的三角形类型:

如果 \(A\ge B+C\),则说明三条边不能构成三角形,请输出:NAO FORMA TRIANGULO

否则,说明三条边可以构成三角形,然后按如下情况输出:

如果 \(A^2=B^2+C^2\),请输出:TRIANGULO RETANGULO

如果 \(A^2\gt B^2+C^2\),请输出:TRIANGULO OBTUSANGULO

如果 \(A^2\lt B^2+C^2\),请输出:TRIANGULO ACUTANGULO

如果三个边长度都相同,请输出:TRIANGULO EQUILATERO

如果只有两个边长度相同而第三个边长度不同,请输出:TRIANGULO ISOSCELES

【输入】

共一行,包含三个正整数 \(A,B,C\)

【输出】

输出 \(A,B,C\) 组成的三角形的类型。

注意,上述条件可能满足不止一条,这种情况下将所有类型名称,按题目介绍顺序输出,每行输出一条。

【输入样例】

7 5 7

【输出样例】

TRIANGULO ACUTANGULO
TRIANGULO ISOSCELES

【核心思想】

  1. 问题分析:给定三个正整数 \(A, B, C\),先将最大值置于 \(A\)(降序排列),然后判定能否构成三角形,若能则按勾股定理和边相等关系输出所有匹配的类型。这是一个条件分支模拟问题,关键在于降序处理后利用最大边进行系统性判定。

  2. 算法选择

    • 排序预处理:通过交换将最大边固定到 \(A\) 位置,简化后续判定逻辑
    • 分层判定:先判定三角形存在性,再按勾股关系判定角类型,最后按边相等关系判定边类型,各条件独立判断以支持多行输出
  3. 关键步骤

    • 读取输入:读取 \(A, B, C\)
    • 降序排列:确保 \(A\) 为最大值:
      • \(A < B\),交换 \(A\)\(B\)
      • \(A < C\),交换 \(A\)\(C\)
    • 三角形存在性判定
      • \(A \ge B + C\),输出 NAO FORMA TRIANGULO(不构成三角形),结束
    • 角类型判定(三条独立 if,可叠加输出):
      • \(A^2 = B^2 + C^2\),输出 TRIANGULO RETANGULO(直角)
      • \(A^2 > B^2 + C^2\),输出 TRIANGULO OBTUSANGULO(钝角)
      • \(A^2 < B^2 + C^2\),输出 TRIANGULO ACUTANGULO(锐角)
    • 边类型判定(两条独立 if,可叠加输出):
      • \(A = B = C\),输出 TRIANGULO EQUILATERO(等边)
      • 若恰有两边相等(A=B≠CA=C≠BB=C≠A),输出 TRIANGULO ISOSCELES(等腰)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),仅涉及常数次比较和算术运算
    • 空间复杂度:\(O(1)\),仅使用三个整数变量
  5. 条件分支模拟的核心思想

    • 降序锚定:将最大边固定到 \(A\) 后,三角形存在性只需判断 \(A \ge B + C\),角类型只需比较 \(A^2\)\(B^2 + C^2\),避免多情况讨论
    • 条件独立性:角类型和边类型的判定相互独立,使用独立 if 而非 if-else,确保满足多条时全部输出(如等腰直角三角形会输出两条)
    • 判定顺序:先判定存在性,再判定角类型,最后判定边类型,符合题目要求的输出顺序
    • 等腰判定技巧:通过三个或条件覆盖所有"恰有两边相等"的情况,同时排除等边三角形(已被等边条件捕获)
    • 适用于多条件分类判定、规则叠加输出类问题

【算法标签】

模拟

【代码详解】

#include <bits/stdc++.h>
using namespace std;
int a, b, c;

int main()
{
    cin >> a >> b >> c;
    // 将最大数交换到a的位置
    if (a < b)
    {
        int t = a;
        a = b;
        b = t;
    }
    if (a < c)
    {
        int t = a;
        a = c;
        c = t;
    }

    // 检查是否能构成三角形
    if (a >= b + c)
    {
        cout << "NAO FORMA TRIANGULO" << endl;
    }
    else
    {
        // 判断三角形类型
        if (a * a == b * b + c * c)
        {
            cout << "TRIANGULO RETANGULO" << endl;  // 直角三角形
        }
        if (a * a > b * b + c * c)
        {
            cout << "TRIANGULO OBTUSANGULO" << endl;  // 钝角三角形
        }
        if (a * a < b * b + c * c)
        {
            cout << "TRIANGULO ACUTANGULO" << endl;  // 锐角三角形
        }
        if (a == b && b == c)
        {
            cout << "TRIANGULO EQUILATERO" << endl;  // 等边三角形
        }
        // 判断等腰三角形
        if (a == b && c != a && c != b || a == c && b != a && b != c || b == c && a != b && a != c)
        {
            cout << "TRIANGULO ISOSCELES" << endl;  // 等腰三角形
        }
    }
    return 0;
}

【运行结果】

7 5 7
TRIANGULO ACUTANGULO
TRIANGULO ISOSCELES
posted @ 2026-07-05 17:09  团爸讲算法  阅读(2)  评论(0)    收藏  举报