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

· · 题解

前置芝士

三条边能构成三角形的条件:

三条边能构成三角形的充分必要条件时两条最小边之和大于第三边。(这是容易证明的)

勾股定理:

一个三角形是直角三角形的充分必要条件是两直角边的平方和是其斜边的平方。

说直白点,我们设直角 \triangle ABC 中,\angle C = 90^{\circ},AB=c,BC=a,CA=b

那么

a^2+b^2=c^2

证明的话就略去了。

余弦定理:

\triangle ABC 中,AB=c,BC=a,CA=b,则

\frac{a^2+b^2-c^2}{2ab} = \cos \angle C

其实不难发现,当 \angle C = \frac{\pi}{2} 时,上式就变为 a^2+b^2-c^2 = 0,也就是勾股定理。

然而这个结论更强,因为当 \angle C > \frac{\pi}{2}\angle C < \frac{\pi}{2} 时,我们也可以得到 a^2+b^2c^2 的大小关系。

具体地,若 \angle C > \frac{\pi}{2}a^2+b^2<c^2;反之,若 \angle C < \frac{\pi}{2}a^2+b^2<c^2。这是因为 2ab > 0a^2+b^2-c^2 = 2ab\cos \angle C 可得 a^2+b^2-c^2 的正负性与 \cos \angle C 相同。

解题思路

OK,把刚刚说的全部放在一边。我们来看看题目要我们求啥。

题目给定三角形的三边,让我们判断它是否具有三角形的某些特质。

首先我们判断是否能构成一个三角形。

那么根据我们刚刚说的,直接判断即可。

那么我们分两类:

第一个问题,我们直接判断三遍是否有等量关系即可。

为解决上面的第二个问题,我们就要用到刚刚提到的余弦定理了。

那么到这里,这道题的思路部分是讲完了,那就看看下面的代码。

代码

#include<iostream>
using namespace std;

int main() {
    int a, b, c; cin >> a >> b >> c;
    if(a > b) swap(a, b);
    if(a > c) swap(a, c);
    if(b > c) swap(b, c); // 将 a, b, c 按从小到大排序
    if(a + b <= c) {cout << "Not triangle" << endl; return 0;} // 注意要结束程序
    if(a * a + b * b == c * c) 
        cout << "Right triangle" << endl;
    if(a * a + b * b > c * c)
        cout << "Acute triangle" << endl;
    if(a * a + b * b < c * c)
        cout << "Obtuse triangle" << endl;
    //判断按角分类的三角形
    if((a == b || a == c)||(c == b || a == c)||(a == b || b == c))
        cout << "Isosceles triangle" << endl;
    if(a == b && a == c && b == c)
        cout << "Equilateral triangle" << endl;
    //判断按边分类的三角形
    return 0;
}