LuoguP5717 【深基3.习8】三角形分类 题解

Content

现给定三条边的长度\(a,b,c(a,b,c\leqslant10000)\),判断是否可以构成三角形。

  • 如果无法构成三角形输出\(\text{Not triangle}\)。
  • 构成的三角形如果是直角三角形输出\(\text{Right triangle}\);
  • 如果是锐角三角形,输出\(\text{Acute triangle}\);
  • 如果是钝角三角形,输出\(\text{Obtuse triangle}\);
  • 如果是等腰三角形,输出\(\text{Isosceles triangle}\);
  • 如果是等边三角形,输出\(\text{Equilateral triangle}\)。

Solution

这道题目看上去不难,做起来却需要多加思考。

首先,需要对三条边的长度进行排序,用一个\(d\)数组存储后sort一遍即可。

排序完之后看,如果最长的一条边大于等于另外两条边的长度和,则无法构成三角形。等腰三角形、等边三角形和直角三角形这些也都好判断,这里不再赘述。

最难的是锐角三角形和钝角三角形。可能大多数小学生和部分初中生都不知道如何判定锐角和钝角三角形。那首先把结论放在这里:

在一个三角形中,如果较短的两条边的平方和大于最长边的平方,那么这个三角形是锐角三角形,否则它是钝角三角形。

可能大多数题解都不会涉及这个结论的证明,那下面我来为大家证明一下。这个结论的证明需要涉及到余弦定理

我们都知道,设三角形三个角的大小分别为\(\angle A,\angle B,\angle C\),三个角的对边分别为\(a,b,c\),则有如下结论:

\[a^2=b^2+c^2-2bc\cos{A} \]

\[\therefore b^2+c^2-a^2=2bc\cos{A} \]

这就是余弦定理。

我们又知道:

\(\cos{\alpha}\begin{cases}>0&\alpha<90^\circ\\<0&90^\circ<\alpha<180^\circ\end{cases}\)

又因为三角形每个角的度数都小于\(180^\circ\),所以当\(\angle A<90^\circ\)时,\(\cos{A}>0\),所以上面这个式子就变成了:

\[b^2+c^2-a^2>0 \]

\[\therefore b^2+c^2>a^2 \]

当\(90^\circ<\angle A<180^\circ\)时,\(\cos{A}<0\),所以如上式子就变成了:

\[b^2+c^2-a^2<0 \]

\[\therefore b^2+c^2<a^2 \]

综上所述,当三角形任意两边平方和大于第三边的平方,说明这个三角形是锐角三角形,否则它就是钝角三角形。

证毕。

证明完这个之后,我们就可以开始写代码了!

Code

#include <cstdio>
#include <algorithm>
using namespace std;

int a, b, c;

int main() {
	scanf("%d%d%d", &a, &b, &c);
	int d[4] = {0, a, b, c};
	sort(d + 1, d + 4);
	if(d[1] + d[2] <= d[3]) {
		printf("Not triangle\n");
		return 0;
	}
	if(d[1] * d[1] + d[2] * d[2] == d[3] * d[3])	printf("Right triangle\n");
	else if(d[1] * d[1] + d[2] * d[2] > d[3] * d[3])	printf("Acute triangle\n");
	else if(d[1] * d[1] + d[2] * d[2] < d[3] * d[3])	printf("Obtuse triangle\n");
	if(a == b || b == c || a == c)	printf("Isosceles triangle\n");
	if(a == b && b == c)	printf("Equilateral triangle\n");
	return 0;
}
上一篇:CodeTop每日系列三题------------------2021.12.26


下一篇:Leetcode动态规划笔记1 三角形最小路径和