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

· · 题解

Content

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

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;
}