具体思路就是求出三边长度然后判断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;
}

京公网安备 11010502036488号