三角形分类(洛谷P5717题题解,Java语言描述)
程序员文章站
2024-01-07 20:22:10
...
题目要求
分析
要明确各个条件之间的关系!
首先是要看是不是三角形,如果不是就不用也不能进行下面的判断,这是必须注意的。
判据是:三角形两边之和大于第三边。
接下来要通过三角形的三个角度判类型,包含锐角三角形、直角三角形、钝角三角形三种。
判据是:余弦定理。
三角形的角度在(0, π)之间,
所以角是钝角的时候余弦值小于0,-2bccosA则大于0,所以:
直角的情况就是勾股定理啦~~
锐角的情况是:
我们接着想啊,只要有了钝角或者直角,这个三角形的形状就可以判了,这种子判断条件之间关系是“或”。
用短路的或会更合适一些。
但是锐角△则是必须三个角全是锐角才能判定。
当然,我想的是,我们既然排除了钝角△(if)、直角△(else if),就肯定是锐角△啦,这样也可以判。
其实等腰△不一定是锐角△、直角△、或者钝角△,但等边既是等腰△也是锐角△,但为了判断方便,建议在判完钝角△/直角△/锐角△之后,独立地判等腰△,等腰△确认后判一下等边△,这样会好一些。
这个题看似很简单,但要保证逻辑的严密,还是值得想想的~~
AC代码(Java语言描述)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt(), b = scanner.nextInt(), c = scanner.nextInt();
scanner.close();
boolean isTriangle = a < b + c && b < a + c && c < a + b;
boolean isObtuse = a*a > b*b + c*c || b*b > a*a + c*c || c*c > a*a + b*b;
boolean isRight = a*a == b*b + c*c || b*b == a*a + c*c || c*c == a*a + b*b;
if (!isTriangle) {
System.out.println("Not triangle");
return;
} else if (isObtuse) {
System.out.println("Obtuse triangle");
} else if (isRight) {
System.out.println("Right triangle");
} else {
System.out.println("Acute triangle");
}
boolean isIsosceles = a == b || a == c || b == c;
boolean isEquilateral = a == b && a == c && b == c;
if (isIsosceles) {
System.out.println("Isosceles triangle");
if (isEquilateral) {
System.out.println("Equilateral triangle");
}
}
}
}
推荐阅读
-
三角形分类(洛谷P5717题题解,Java语言描述)
-
动态规划求解"疯狂的采药"问题(洛谷P1616题题解,Java语言描述)
-
用贪心策略均分纸牌(洛谷P1031题题解,Java语言描述)
-
最大公约数和最小公倍数问题(洛谷P1029题题解,Java语言描述)
-
加括号改变连除式结果(洛谷P2651题题解,Java语言描述)
-
去重的Set解不出“斯诺登的密码”(洛谷P1603题题解,Java语言描述)
-
求子集元素之和(洛谷P2415题题解,Java语言描述)
-
数列分段(洛谷P1181题题解,Java语言描述)
-
在小范围内[打表]验证哥德巴赫猜想(洛谷P1579题题解,Java语言描述)
-
长方体工艺品の切割(洛谷P5729题题解,Java语言描述)