1. 程式人生 > 其它 >LuoguP5717 【深基3.習8】三角形分類 題解

LuoguP5717 【深基3.習8】三角形分類 題解

LuoguP5717 【深基3.習8】三角形分類 題解

Content

現給定三條邊的長度\(a,b,c(a,b,c\leqslant10000)\),判斷是否可以構成三角形。

  • 如果無法構成三角形輸出\(\text{Not triangle}\)
  • 構成的三角形如果是直角三角形輸出\(\text{Right triangle}\)
  • 如果是銳角三角形,輸出\(\text{Acute triangle}\)
  • 如果是鈍角三角形,輸出\(\text{Obtuse triangle}\)
  • 如果是等腰三角形,輸出\(\text{Isosceles triangle}\)
  • 如果是等邊三角形,輸出\(\text{Equilateral triangle}\)

Solution

這道題目看上去不難,做起來卻需要多加思考。

首先,需要對三條邊的長度進行排序,用一個\(d\)陣列儲存後sort一遍即可。

排序完之後看,如果最長的一條邊大於等於另外兩條邊的長度和,則無法構成三角形。等腰三角形、等邊三角形和直角三角形這些也都好判斷,這裡不再贅述。

最難的是銳角三角形和鈍角三角形。可能大多數小學生和部分初中生都不知道如何判定銳角和鈍角三角形。那首先把結論放在這裡:

在一個三角形中,如果較短的兩條邊的平方和大於最長邊的平方,那麼這個三角形是銳角三角形,否則它是鈍角三角形。

可能大多數題解都不會涉及這個結論的證明,那下面我來為大家證明一下。這個結論的證明需要涉及到餘弦定理

我們都知道,設三角形三個角的大小分別為\(\angle A,\angle B,\angle C\),三個角的對邊分別為\(a,b,c\),則有如下結論:

\[a^2=b^2+c^2-2bc\cos{A} \]\[\therefore b^2+c^2-a^2=2bc\cos{A} \]

這就是餘弦定理。

我們又知道:

\(\cos{\alpha}\begin{cases}>0&\alpha<90^\circ\\<0&90^\circ<\alpha<180^\circ\end{cases}\)

又因為三角形每個角的度數都小於\(180^\circ\),所以當\(\angle A<90^\circ\)

時,\(\cos{A}>0\),所以上面這個式子就變成了:

\[b^2+c^2-a^2>0 \]\[\therefore b^2+c^2>a^2 \]

\(90^\circ<\angle A<180^\circ\)時,\(\cos{A}<0\),所以如上式子就變成了:

\[b^2+c^2-a^2<0 \]\[\therefore b^2+c^2<a^2 \]

綜上所述,當三角形任意兩邊平方和大於第三邊的平方,說明這個三角形是銳角三角形,否則它就是鈍角三角形。

證畢。

證明完這個之後,我們就可以開始寫程式碼了!

Code

#include <cstdio>
#include <algorithm>
using namespace std;

int a, b, c;

int main() {
	scanf("%d%d%d", &a, &b, &c);
	int d[4] = {0, a, b, c};
	sort(d + 1, d + 4);
	if(d[1] + d[2] <= d[3]) {
		printf("Not triangle\n");
		return 0;
	}
	if(d[1] * d[1] + d[2] * d[2] == d[3] * d[3])	printf("Right triangle\n");
	else if(d[1] * d[1] + d[2] * d[2] > d[3] * d[3])	printf("Acute triangle\n");
	else if(d[1] * d[1] + d[2] * d[2] < d[3] * d[3])	printf("Obtuse triangle\n");
	if(a == b || b == c || a == c)	printf("Isosceles triangle\n");
	if(a == b && b == c)	printf("Equilateral triangle\n");
	return 0;
}