如何优化仅用逻辑运算符的直角三角形判定代码?
问题分析与修正方案
你的问题核心是逻辑运算符优先级导致的逻辑错误:&&的优先级高于||,所以你修改后的代码实际等价于:
boolean check = (a > 0 && b > 0 && c > 0 && a * a + b * b == c * c) || (a * a + c * c == b * b) || (b * b + c * c == a * a);
也就是说,只有第一个勾股判定会绑定正数校验,后面两个勾股判定完全跳过了正数检查。当输入-3 4 -5时,(-3)² + 4² = (-5)²这个条件成立,且不受正数校验约束,所以最终返回true。
修正后的代码
把三个勾股条件用括号包裹,让正数校验同时作用于所有判定逻辑:
double a = Double.parseDouble(args[0]); double b = Double.parseDouble(args[1]); double c = Double.parseDouble(args[2]); boolean check = a > 0 && b > 0 && c > 0 && (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a); StdOut.println(check);
额外优化提示
用==比较浮点数存在精度风险(浮点数运算可能产生微小误差),如果要更严谨,可以用差值的绝对值小于极小值来判断近似相等,例如把a*a + b*b == c*c替换为:
Math.abs(a*a + b*b - c*c) < 1e-9
内容的提问来源于stack exchange,提问作者CowardPeasant
相关产品推荐
相关产品推荐

