題目說明#
三角形除了是最基本的多邊形外,亦可進一步細分為鈍角三形、直角三角形及銳角三角形。若給定三個線段的長度,透過下列公式運算,即可得知此三線段能否構成三角形,亦可判斷是直角、銳角和鈍角三角形。
若 a、b、c 為三個線段的邊長,且 c 為最大值,則:
- 若 \(a+b \leq c\),三線段無法構成三角形
- 若 \(a \times a+b \times b < c \times c\),三線段構成鈍角三角形(Obtuse triangle)
- 若 \(a \times a +b \times b = c \times c\),三線段構成直角三角形(Right triangle)
- 若 \(a \times a+b \times b > c \times c\),三線段構成銳角三角形(Acute triangle)
請設計程式以讀入三個線段的長度判斷並輸出此三線段可否構成三角形?若可,判斷並輸出其所屬三角形類型。
解題過程#
首先先宣告三個變數 a, b, c 並輸入:
int a, b, c;
cin >> a >> b >> c;
接著為了確保能夠正確判斷三角形的類型,我們需要將輸入的三邊長 a、b、c 依照大小進行排序。排序的目的是讓 c 成為最大值,a 成為最小值,這樣我們在後續判斷三角形類型時,可以更方便地使用數學公式進行比較。
排序的第一步就是要讓 a 成為最小值,所以我們可以先比較 a 和 b 的大小,若 a 大於 b,則交換 a 和 b 的值。
這邊我們要用到 swap 函式,這個函式可以交換兩個變數的值:
if (a > b) swap(a, b);
接著再比較 a 和 c 的大小,若 a 大於 c,則交換 a 和 c 的值:
if (a > c) swap(a, c);
這時候我們已經可以確定 a 是最小值,接著我們要確保 c 是最大值,所以我們再比較 b 和 c 的大小,若 b 大於 c,則交換 b 和 c 的值:
if (b > c) swap(b, c);
既然 a 已經成為最小值,c 已經成為最大值,那麼我們就可以確定 b 一定是中間值了。這樣我們就完成了排序的步驟,接著我們可以輸出排序後的三邊長:
cout << a << " " << b << " " << c << endl;
最後就是根據上面的提示判斷三角形的類型。首先判斷是否能夠構成三角形,然後再判斷三角形的類型:
if (a + b <= c) {
cout << "No";
} else {
if (a * a + b * b < c * c) {
cout << "Obtuse";
} else if (a * a + b * b == c * c) {
cout << "Right";
} else if (a * a + b * b > c * c) {
cout << "Acute";
}
}
這樣就完成了!完整的程式碼如下:
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
if (a > b) swap(a, b);
if (a > c) swap(a, c);
if (b > c) swap(b, c);
cout << a << " " << b << " " << c << endl;
if (a + b <= c) {
cout << "No";
} else {
if (a * a + b * b < c * c) {
cout << "Obtuse";
} else if (a * a + b * b == c * c) {
cout << "Right";
} else if (a * a + b * b > c * c) {
cout << "Acute";
}
}
}
