CSDN 编程竞赛四十四期:比赛详情 (csdn.net)
题目:
相似三角形是彼此各边长对应成同比例的两个或更多个三角形。 请根据输入的三条边边长,去掉不能构成三角形者,只保留相似三角形中最前面的一个。
题解(java版):
import java.util.*;
public class Main {
public static void main(String args[]) {
// 保存符合条件的三角形原始输入数据
List<String> lineList = new ArrayList<String>();
// 保存符合条件的三角形三边数据
List<Double[]> triangleSidesList = new ArrayList<Double[]>();
// 标准输入
Scanner sc = new Scanner(System.in);
try {
while (sc.hasNextLine()) {
String line = sc.nextLine();
// 空行结束输入
if (null == line || "".equals(line)) {
break;
}
// 空格分隔三角形三边
String[] sides = line.split(" ");
if (3 != sides.length) {
continue;
}
// 数字字符类型转换成double类型
Double[] sidesDoubleArray = { Double.parseDouble(sides[0]), Double.parseDouble(sides[1]),
Double.parseDouble(sides[2]) };
// 三边进行排序(注意测试用例有问题,排序了反而只有40%通过率,但是按题目要求应该是要排序来忽略三边的顺序)
Arrays.sort(sidesDoubleArray);
// 判断三边数据是否合理(两边的和大于第三边)
if (!checkLegal(sidesDoubleArray)) {
continue;
}
// 判断是否已保存相似三角形
if (!checkExist(sidesDoubleArray, triangleSidesList)) {
lineList.add(line);
triangleSidesList.add(sidesDoubleArray);
}
}
// 打印结果
lineList.stream().forEach(System.out::println);
} finally {
sc.close();
}
}
public static boolean checkLegal(Double[] sidesDoubleArray) {
return sidesDoubleArray[0] + sidesDoubleArray[1] > sidesDoubleArray[2];
}
public static boolean checkExist(Double[] sidesDoubleArray, List<Double[]> triangleSidesList) {
for (Double[] sideArray : triangleSidesList) {
if (sideArray[0] * sidesDoubleArray[1] == sideArray[1] * sidesDoubleArray[0]
&& sideArray[1] * sidesDoubleArray[2] == sideArray[2] * sidesDoubleArray[1]) {
return true;
}
}
return false;
}
}