难度:普及−
题目描述
给出三条线段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
输出 #2
Right triangle
输入 #3
6 10 6
输出 #3
Obtuse triangle Isosceles triangle
输入 #4
1 14 5
输出 #4
Not triangle
说明/提示
当两短边的平方和大于一长边的平方,说明是锐角三角形。
当两短边的平方和等于一长边的平方,说明是直角三角形。
当两短边的平方和小于一长边的平方,说明是钝角三角形。
思路
这道题难在一个三角形有可能是多种三角形,这个时候我们不能用“else if”,可以用“if”来解决。
如果a,b,c无法构成三角形,那么就退出循环,否则程序就会继续往下运行。
因为一个三角形只能是直角三角形、锐角三角形、钝角三角形中的一个,只要满足其中的一个条件,就进行下一层的判断。
因为一个三角形如果是等边三角形,那么它必是等腰三角形,但是等腰三角形未必是等边三角形。
完整代码
#include<bits/stdc++.h> //万能头文件
using namespace std; //使用标准命名空间
int a[4],temp; //定义a[4]为三角形的四条边,temp帮助排序
int main() { //主函数
for(int i=1; i<=3; ++i) cin>>a[i]; //利用循环将边长存入数组a中
if(a[1]>a[2]) temp=a[1],a[1]=a[2],a[2]=temp;//冒泡排序
if(a[2]>a[3]) temp=a[2],a[2]=a[3],a[3]=temp;
if(a[1]>a[2]) temp=a[1],a[1]=a[2],a[2]=temp;
if(a[1]+a[2]<=a[3]){ //勾股定理
cout<<"Not triangle"<<endl; //不是三角形输出“Not triangle”,注意换行
return 0; //如果不是三角形,return 0退出程序
}
if(a[3]*a[3]==(a[2]*a[2]+a[1]*a[1])){ //判断直角三角形
cout<<"Right triangle"<<endl;
}
else if(a[3]*a[3]>(a[2]*a[2]+a[1]*a[1])){ //判断钝角三角形
cout<<"Obtuse triangle"<<endl;
}
else if(a[3]*a[3]<(a[2]*a[2]+a[1]*a[1])){ //判断锐角三角形
cout<<"Acute triangle"<<endl;
}
if(a[1]==a[2]||a[2]==a[3]||a[3]==a[1]){ //判断等边三角形
cout<<"Isosceles triangle"<<endl;
}
if(a[1]==a[2]&&a[2]==a[3]){ //判断等腰三角形
cout<<"Equilateral triangle"<<endl;
}
return 0; //返回值为0
}