給定平面上任意三個點的坐標(x1,y1)、(x2,y2)、(x3,y3? ),檢驗它們能否構成三角形。
輸入格式:
輸入在一行中順序給出六個[?100,100]范圍內的數字,即三個點的坐標x1、y1? 、x2? 、y2? 、x3? 、y3? 。
輸出格式:
若這3個點不能構成三角形,則在一行中輸出“Impossible”;若可以,則在一行中輸出該三角形的周長和面積,格式為“L = 周長, A = 面積”,輸出到小數點后2位。
輸入樣例1:
4 5 6 9 7 8
輸出樣例1:
L = 10.13, A = 3.00
輸入樣例2:
4 6 8 12 12 18
輸出樣例2:
Impossible
思路:用向量的叉乘計算面積
代碼:
#include<stdio.h>
#include<math.h>
int main(int argc,const char *argv[])
{
double x1,x2,x3,y1,y2,y3;
double l,a;
scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3);
if((x1-x2)*(y2-y3)==(x2-x3)*(y1-y2))
{
printf("Impossible");
}
else
{
l=sqrt(pow((x1-x2),2)+pow((y1-y2),2))+sqrt(pow((x1-x3),2)+pow((y1-y3),2))+sqrt(pow((x2-x3),2)+pow((y2-y3),2));
a=fabs((x1-x2)*(y3-y2)-(x3-x2)*(y1-y2))/2;
printf("L = %.2lf, A = %.2lf",l,a);
}
return 0;
}
這個代碼一直不能通過最后一個測驗點,樣例都是正確的,不知道哪位大神能幫幫我
uj5u.com熱心網友回復:
if((x1-x2)*(y2-y3)==(x2-x3)*(y1-y2)) 這么等就是不對的浮點數的等要用
fabs(它們的差)<1e-12;
uj5u.com熱心網友回復:
邏輯看起來好像沒什么問題printf結束要加\n吧?
uj5u.com熱心網友回復:
三點不共線即可組成三角形,沒有必要算距離uj5u.com熱心網友回復:
長知識了,但是我改掉之后還是不可以的,之前我換成海倫公式算面積,是可以通過的,所以我覺得這個判斷相等的地方應該不是關鍵問題uj5u.com熱心網友回復:
其實就是求fabs (y2-y1/x2-x1)和 fabs(y3-y1/x3-x1) 是否相等uj5u.com熱心網友回復:
怎么單獨回復一層的呀。。。uj5u.com熱心網友回復:
這個地方我明白了,之前就一直沒注意到這點,但是我現在不明白的是求面積的地方為什么不對
uj5u.com熱心網友回復:
長知識了,但是我改掉之后還是不可以的,之前我換成海倫公式算面積,是可以通過的,所以我覺得這個判斷相等的地方應該不是關鍵問題
uj5u.com熱心網友回復:
算面積也要涉及浮點數運算,不精確。
最好是計算這3個點之間的矢量,
上邊我回復有點問題,三角函式早丟了,計算
(y2-y1) /(x2-x1) 和(y3-y1) /(x3-x1) 是否相等。兩個分數分別轉化為最簡式,通過約分,判斷分母是否相等且分子是否相等,相等則無法形成三角形,不等既可以。
uj5u.com熱心網友回復:
我也是這么想的,我就是把除法轉化成乘法,防止它分母萬一是0,具體在浮點數運算的時候到底哪個地方會有精度的不準確啊,還望大佬指教
uj5u.com熱心網友回復:
分數比較,其實是通分后或者化簡后,分子比分子,分母比分母,只要點的坐標是用整形表示,就不用考慮浮點。uj5u.com熱心網友回復:
不是fabs都,那個不對滴
是 fabs( (x1-x2)*(y2-y3) - (x2-x3)*(y1-y2)) < 1e-12
不能多套fabs
寫到這個,不得不抱怨樓主,你就不能弄兩個中間變數啊 dx1=x2-x1, dy1=y2-y1, dx2=x3-x1, dy2=y3-y1
這一遍遍的算麻煩不說, 恢復還要一遍一遍的重復敲

dy1/dx1 和 dy2/dx2 相當于是斜率
斜率必須相同才是對的, -dy1/dx1 和 dy1/dx1 可不是在一條直線上啊(斜率k和-k是關于坐標軸對稱的關系)
只能是 fabs( dx1*dy2 - dx2*dy1) < 1e-12 這么判斷
uj5u.com熱心網友回復:
樓主只有最后一道題錯, 說明錯誤不是在公式本身上, 要是公式有錯, 那就不是一道題的問題了應該還是邊界條件的可能性更大
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/131831.html
標籤:C語言
下一篇:命令列引數
