抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

题目大意

给定$a,b,c(0< a,b,c\leq10000)$,要求:

  • 如果三条线段不能组成一个三角形,输出$\texttt{Not triangle}$;
  • 如果是直角三角形,输出$\texttt{Right triangle}$;
  • 如果是锐角三角形,输出$\texttt{Acute triangle}$;
  • 如果是钝角三角形,输出$\texttt{Obtuse triangle}$;
  • 如果是等腰三角形,输出$\texttt{Isosceles triangle}$;
  • 如果是等边三角形,输出$\texttt{Equilateral triangle}$。
  • 如果这个三角形符合以上多个条件,请分别输出,并用换行符隔开。

思路

首先,我们知道三角形不等式,也就是:
$$a+b> c,a+c>b,c+b>a$$
那么我们有第一个代码:

1
if( !( (a + b > c) && (a + c > b) && (b + c > a) ))cout << "Not triangle" << endl;

如果你知道勾股定理,也就是,对于一个直角三角形,一定有两直角边平方的和等于第三条边的平方,也就是:
$$a^2+b^2=c^2$$
GJnFTf.png

那么我们有:

1
if(a*a+b*b==c*c) cout << "Right triangle" << endl;

那么我们要思考,锐角三角形和钝角三角形怎么办呢?不妨我们来画个图:

GJnXBq.png

我们令$a$不变,移动$b,c$,那么你会发现:钝角三角形相当于直角三角形$b$的增长,那么一定有:$a^2+b^2>c^2$;锐角三角形相当于$b$的缩小,那么就有:$a^2+b^2<c^2$
那么我们有:

1
2
3
if(a*a+b*b<c*c) cout << "Acute triangle" << endl;
if(a*a+b*b>c*c) cout << "Obtuse triangle" << endl;

那等腰三角形和等边三角形就好判断了:

1
2
if(a==b||a==c||b==c) cout << "Isosceles triangle" << endl;
if(a==b&&b==c) cout << "Equilateral triangle" << endl;

那么,完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>//万能头
using namespace std;
void swap(int a,int b){int t;t = a;a = b;b = t;}
int main(){
int a,b,c;
cin >> a >> b >> c;
if(a>b)swap(a,b);
if(a>b)swap(a,c);
if(b>c)swap(b,c);
/*
这个排序很重要!
我们在使用勾股定理的时候,(a,b)和c的顺序是不能颠倒的
*/
if( !( (a + b > c) && (a + c > b) && (b + c > a) ))cout << "Not triangle" << endl;
else{//是三角形才有下面这些东西:
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||b==c) cout << "Isosceles triangle" << endl;
if(a==b&&b==c) cout << "Equilateral triangle" << endl;
}
return 0;
}

评论