洛谷P5717-三角形分类
题目
这道题更像是初中题,但是怎么能完整的按照题目的意思来解决呢,说实话这个题卡了我有一会儿,要做一次性做出这个题,我觉得需要搞清楚if-if 和if-else if-else if,试想这两个的区别是什么?无非是无论下面是否有满足条件的语句,有几个if就判断多少次,而如果使用if-else if -else if,如果第一个if就满足条件下面所有的else if都不会再进行判断,对这个题目来说,既然是判断三角形,那首先要是一个三角形吧,如果不是三角形,那我就不用判断是哪种三角形了,我这里如果连三角形都不是就直接return 0结束了,如果判断是三角形,才判断是哪种三角形,首先判断是钝角、直角、锐角哪一种三角形,明显三角形只能是其中一种,所以我用
if(a[3]*a[3]==(a[2]*a[2]+a[1]*a[1])) printf("Right triangle\n");
else if(a[3]*a[3]>(a[2]*a[2]+a[1]*a[1])) printf("Obtuse triangle\n");
else if(a[3]*a[3]<(a[2]*a[2]+a[1]*a[1]))printf("Acute triangle\n");
但是为什么下面判断等腰三角形和等边三角形又用了两个if而不是else if呢,那是因为等边三角形一定是等腰三角形,这两个存在一个等边三角形=>等腰三角形的关系,而不是只能满足其中某一个所以用
if(a[1]==a[2]||a[2]==a[3]||a[3]==a[1]) printf("Isosceles triangle\n");
if(a[1]==a[2]&&a[2]==a[3]) printf("Equilateral triangle\n");
这个题目主要是考if-if-if 和if-else if - else if的区别,很多时候我并没有注意过这些区别,只是一味的用if,但是如果在需要判断的多的情况下,纯if判断会降低效率。
代码
#include<bits/stdc++.h>
using namespace std;
int a[4],n=3;
int main() {
for(int i=1; i<=3; ++i) scanf("%d",&a[i]);
sort(a+1,a+n+1);
if(a[1]+a[2]<=a[3]) {
printf("Not triangle\n");
return 0;
}
if(a[3]*a[3]==(a[2]*a[2]+a[1]*a[1])) printf("Right triangle\n");
else if(a[3]*a[3]>(a[2]*a[2]+a[1]*a[1])) printf("Obtuse triangle\n");
else if(a[3]*a[3]<(a[2]*a[2]+a[1]*a[1]))printf("Acute triangle\n");
if(a[1]==a[2]||a[2]==a[3]||a[3]==a[1]) printf("Isosceles triangle\n");
if(a[1]==a[2]&&a[2]==a[3]) printf("Equilateral triangle\n");
return 0;
}