题解:学而思编程 三角形类型
【题目来源】
学而思编程:三角形类型
【题目描述】
读取表示三角形三条边的 \(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
【核心思想】
-
问题分析:给定三个正整数 \(A, B, C\),先将最大值置于 \(A\)(降序排列),然后判定能否构成三角形,若能则按勾股定理和边相等关系输出所有匹配的类型。这是一个条件分支模拟问题,关键在于降序处理后利用最大边进行系统性判定。
-
算法选择:
- 排序预处理:通过交换将最大边固定到 \(A\) 位置,简化后续判定逻辑
- 分层判定:先判定三角形存在性,再按勾股关系判定角类型,最后按边相等关系判定边类型,各条件独立判断以支持多行输出
-
关键步骤:
- 读取输入:读取 \(A, B, C\)
- 降序排列:确保 \(A\) 为最大值:
- 若 \(A < B\),交换 \(A\) 与 \(B\)
- 若 \(A < C\),交换 \(A\) 与 \(C\)
- 三角形存在性判定:
- 若 \(A \ge B + C\),输出
NAO FORMA TRIANGULO(不构成三角形),结束
- 若 \(A \ge B + C\),输出
- 角类型判定(三条独立
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(锐角)
- 若 \(A^2 = B^2 + C^2\),输出
- 边类型判定(两条独立
if,可叠加输出):- 若 \(A = B = C\),输出
TRIANGULO EQUILATERO(等边) - 若恰有两边相等(
A=B≠C或A=C≠B或B=C≠A),输出TRIANGULO ISOSCELES(等腰)
- 若 \(A = B = C\),输出
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),仅涉及常数次比较和算术运算
- 空间复杂度:\(O(1)\),仅使用三个整数变量
-
条件分支模拟的核心思想:
- 降序锚定:将最大边固定到 \(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
浙公网安备 33010602011771号