1 条题解

  • 0
    @ 2025-8-24 22:13:42

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Eason_AC
    Remember? / AFOed on 2022.6.14 / 彻底死咯

    搬运于2025-08-24 22:13:42,当前版本为作者最后更新于2020-01-18 22:48:28,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Content

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

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

    Solution

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

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

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

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

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

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

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

    a2=b2+c22bccosAa^2=b^2+c^2-2bc\cos{A} b2+c2a2=2bccosA\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}$

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

    b2+c2a2>0b^2+c^2-a^2>0 b2+c2>a2\therefore b^2+c^2>a^2

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

    b2+c2a2<0b^2+c^2-a^2<0 b2+c2<a2\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;
    }
    
    • 1

    信息

    ID
    4683
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者