【题目】
给出三条线段 a,b,c 的长度,均是不大于 10000 的正整数。打算把这三条线段拼成一个三角形,它可以是什么三角形呢?
- 如果三条线段不能组成一个三角形,输出
Not triangle; - 如果是直角三角形,输出
Right triangle; - 如果是锐角三角形,输出
Acute triangle; - 如果是钝角三角形,输出
Obtuse triangle; - 如果是等腰三角形,输出
Isosceles triangle; - 如果是等边三角形,输出
Equilateral triangle。
如果这个三角形符合以上多个条件,请按以上顺序分别输出,并用换行符隔开。
输入格式
输入 3 个整数 a、b 和 c。
输出格式
输出若干行判定字符串。
输入样例1:
3 3 3
输出样例1:
Acute triangle
Isosceles triangle
Equilateral triangle
输入样例2:
3 4 5
输出样例3:
Right triangle
输入样例3:
6 10 6
输出样例3:
Obtuse triangle
Isosceles triangle
【概念】
1、三角形满足条件:任意两条边之和大于第三条边
2、锐角三角形满足条件:
- (1)是三角形
- (2)任意两边平方和大于第三边平方
3、钝角三角形满足条件:
- (1)是三角形
- (2)两条短边的平方和小于最长边的平方
4、直角三角形满足条件:
- (1)是三角形
- (2)两条直角边的平方和等于第三条边的平方
【解题思路】
-
为了简化后面的逻辑判断语句,可以先对三个数进行从小到大排序,而对多个数进行排序,简单的方法是将多个数存储数组,用sort对数组进行排序。
-
排序之后后面再写逻辑判断语句时,可以将"任意两条边之和大于第三条边"、"任意两边平方和大于第三边平方"这种描述表示为"两个短边之和大于最长边","两个短边的平方和大于最长边的平方",就不需要再表示任意两天边了。
-
等腰三角形和等边三角形的判断要和前面的直角、锐角、钝角三角形并行判断,也就是在满足前面是直角或者锐角或者钝角三角形的情况下,也有可能是等腰三角形或者等边三角形,所有后面的两个判断条件要写if,不能写else if。
【代码】
cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{
//三角形:任意两条边之和大于第三条边
int a[3];
for(int i=0;i<3;i++)
cin>>a[i];
sort(a,a+3);//对数组进行由小到大排序,排序的目的是简化后面分支结构中的逻辑判断
//只需要判断最小的两条边之和小于最大边,则说明不能构成三角形,不用再判断任意两条边。
if(a[0]+a[1]<=a[2])
cout<<"Not triangle";
else
{
//直角三角形:在保证是三角形的前提下,两条直角边的平方和等于第三条边的平方
if(pow(a[0],2)+pow(a[1],2)==pow(a[2],2))
cout<<"Right triangle"<<endl;
//锐角三角形:在保证是三角形的前提下,任意两边平方和大于第三边平方
//在这只需要判断,两个短边的平方和大于把最长边的平方和
else if(pow(a[0],2)+pow(a[1],2)>pow(a[2],2))
cout<<"Acute triangle"<<endl;
//钝角三角形:在保证是三角形的前提下,两条短边的平方和小于最长边的平方
else if(pow(a[0],2)+pow(a[1],2)<pow(a[2],2))
cout<<"Obtuse triangle"<<endl;
//由于等腰三角形和前面的三种情况不是同一种分类,前面的条件成立,同样也可能是等腰三角形
//所以用if
if(a[0]==a[1]||a[1]==a[2])
cout<<"Isosceles triangle"<<endl;
//同样前面的条件满足,同样也可能是等边三角形,所以用if
if(a[0]==a[1]&&a[1]==a[2])
cout<<"Equilateral triangle";
}
return 0;
}