具体思路就是求出三边长度然后判断a^2+b^2是否等于c^2;但其中有一点细节性的问题:浮点数直接判断相等可能会翻车。计算机专业的朋友在机组里学过IEEE协议(没学过的朋友可以百度一下),直接用==判断两个浮点数相等由于精度问题是非常不明智的选择。我这里有两种思路。
1.设定一个精度下限e=0.00000(多少个0看自己喜欢)00001,如果两个浮点数的差值小于e,则可近似认为两个浮点数相等。
例:if ( abs(a - b) < e ) //则a=b
2.是我在网上发现的奇淫技巧
例:if ( !(a > b) || a < b) ) // 则a=b
这个方法的巧妙之处就在于避免了直接判断相等,无论精度如何,两个数的大小是可以直接判断的,如果a和b相等,那么a>b 和 a<b 都是false,或运算之后为false再取反为true;如果a,b不相等,那么a>b 和 a<b 中有一个为true,或运算之后结果为true再取反为false。
其余的部分就不用多说了,不涉及任何算法和数据结构,由于准备复试刷题走量不走质量,代码比较丑还请原谅orz.
#include <iostream> #include <cmath> #include <cstdio> using namespace std; int main() { int m; double x1,x2,x3,y1,y2,y3; double a,b,c; double x,y,z; cin >> m; while ( m -- ) { cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3; a = pow(x1-x2,2)+pow(y1-y2,2); b = pow(x1-x3,2)+pow(y1-y3,2); c = pow(x2-x3,2)+pow(y2-y3,2); x = min(min(a,b),c); z = max(max(a,b),c); y = a + b + c - x - z; if ( !( x+y > z || x+y < z ) ) cout << "Yes" << endl; else cout << "No" << endl; printf("%.2f\n",sqrt(a)+sqrt(b)+sqrt(c)); } return 0; }