Постановка задачи
Даны действительные числа [latex]x[/latex], [latex]y[/latex], [latex]z[/latex], задающие длины сторон некоторого треугольника. Будет ли треугольник остроугольным, тупоугольным или прямоугольным? Какой из трёх случаев самый маловероятный?
Алгоритм решения
По теореме косинусов
[latex]a^2 = b^2 + c^2 — 2 \cdot b \cdot c \cdot \cos\alpha[/latex],
где [latex]a[/latex], [latex]b[/latex], [latex]c[/latex] — стороны треугольника, а [latex]\alpha[/latex] — угол между [latex]a[/latex] и [latex]b[/latex], тогда
[latex]\alpha = \arccos\frac{b^2 + c^2 — a^2}{2 \cdot b \cdot c}[/latex],
[latex]\beta = \arccos\frac{c^2 + a^2 — b^2}{2 \cdot a \cdot c}[/latex],
[latex]\gamma = \arccos\frac{a^2 + b^2 — c^2}{2 \cdot a \cdot b}[/latex],
где [latex]\alpha[/latex], [latex]\beta[/latex], [latex]\gamma[/latex] — углы треугольника.
Если самый большой угол больше [latex]\frac{\pi}{2}[/latex], то треугольник тупоугольный, если самый большой угол равен [latex]\frac{\pi}{2}[/latex], то треугольник прямоугольный, если самый большой угол меньше [latex]\frac{\pi}{2}[/latex], то треугольник остроугольный. Так как треугольник является прямоугольным только в том случае, когда самый большой угол равен [latex]\frac{\pi}{2}[/latex], этот случай является самым маловероятным.
Тесты
Входные данные | Выходные данные | ||
[latex]a[/latex] | [latex]b[/latex] | [latex]c[/latex] | |
2 | 2 | 3 | Тупоугольный |
3 | 4 | 5 | Прямоугольный |
1 | 1 | 1 | Остроугольный |
Реализация
ideone: ссылка
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> #include <cmath> using namespace std; int main() { double a, b, c; cin >> a >> b >> c; double angle0 = acos((b * b + c * c - a * a) / (2 * b * c)); double angle1 = acos((c * c + a * a - b * b) / (2 * a * c)); double angle2 = acos((a * a + b * b - c * c) / (2 * a * b)); double maxAngle = angle0 > angle1 ? (angle0 > angle2 ? angle0 : angle2) : (angle1 > angle2 ? angle1 : angle2); if(maxAngle > M_PI / 2) { cout << "Тупоугольный"; } else if(maxAngle == M_PI / 2) { cout << "Прямоугольный"; } else { cout << "Остроугольный"; } cout << endl; return 0; } |