时间限制(普通/Java) : 2000 MS/ 6000 MS 运行内存限制 : 65536 KByte
总提交 : 412 测试通过 : 41
比赛描述
在平面上给你三个点A,B,C,计算三角形ABC的面积
输入
第一行一个整数T,表示数据的个数,1<=T<=100000
接下来T行,每行6个整数,x1 y1 x2 y2 x3 y3,分别表示三个点的坐标,-109<=x1,y1,x2,y2,x3,y3<=109
输出
T行,对应每个三角形的面积,答案精确到小数点后2位
样例输入
2
0 0 0 1 1 1
0 0 1 1 -1 1
样例输出
0.50
1.00
思路:向量求叉乘的绝对值,然后按照奇偶性输出(因为double精度问题)
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
#include <iostream> #include <cstdio> #include <cmath> using namespace std; #define ll long long #define x1 x11 #define y1 y11 int t,x1,y1,x2,y2,x3,y3; int main() { scanf("%d",&t); while (t--) { scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3);//两个向量分别为:(x2-x1,y2-y1),(x3-x1,y3-y1) ll ans=abs((ll)(x2-x1)*(y3-y1)-(ll)(x3-x1)*(y2-y1)); if (ans%2==0) printf("%I64d.00\n",ans/2); else printf("%I64d.50\n",ans/2); } return 0; }