Задача "Треугольник"
[назад]
Заданы длины трех отрезков a, b,
c. Необходимо определить, можно ли из них составить треугольник. В случае
утвердительного ответа определить его тип: остроугольный, прямоугольный или
тупоугольный.
Вход.
Три целых числа a, b, c – длины трех
отрезков.
Выход.
Строка, содержащая информацию о треугольнике: “ACUTE”, если он остроугольный,
“RIGHT” если прямоугольный и
“OBTUSE” если тупоугольный. Если из трех отрезков составить треугольник
нельзя, то вывести “NONE”.
Пример входа
3 4 5
Пример выхода
RIGHT
Решение. Геометрия.
Анализ алгоритма
Из трех отрезков a, b,
c
можно составить треугольник, если выполняется неравенство треугольника: сумма
длин двух любых сторон треугольника строго больше длины третьей.
Из теоремы Пифагора следует, что треугольник со сторонами
a, b, c является
прямоугольным, если выполняется одно из следующих равенств:
a2
= b2 +
c2
или b2 = a2
+ c2 или
c2
= a2 + b2
Треугольник будет остроугольным, если квадрат каждой стороны строго меньше суммы
квадратов двух других сторон. То есть одновременно выполняется три неравенства:
a2
< b2 +
c2,
b2 < a2
+ c2, c2 < a2
+ b2
Треугольник является тупоугольным, если существует такая сторона, квадрат
которой строго больше суммы квадратов двух других сторон. То есть выполняется
одно из трех неравенств:
a2
> b2 +
c2
или b2 > a2
+ c2 или
c2
> a2 + b2
Условие тупоугольности можно не проверять: если треугольник не является ни
остроугольным, ни прямоугольным, то он является тупоугольным. Для вывода
результата воспользуемся типом
string.
program triangle;
var
a,b,c:integer;
res:string;
begin
readln(a,b,c);
if ((a >= b + c) or (b >= a + c) or (c >= a + b))
then res := 'NONE' else
if ((a*a = b*b + c*c) or (b*b = a*a + c*c) or (c*c = a*a + b*b))
then res := 'RIGHT' else
if ((a*a < b*b + c*c) and (b*b < a*a + c*c) and (c*c < a*a + b*b))
then res := 'ACUTE' else
res := 'OBTUSE';
writeln(res);
end.
Задача решена, но имеет один недостаток. При проверке типа треугольника
приходится каждый раз проверять три условия: в каждом из условных операторов if стоит три выражения. Можно сделать так, что в каждом условном операторе
будет стоять лишь одно условие. Подумайте, как это сделать?
Ответ на вопрос дает сортировка. Отсортируем по возрастанию длины исходных
отрезков. Пусть у нас далее имеют место неравенства:
a
£ b £
c. Тогда для проверки неравенства треугольника достаточно проверить лишь
a
+ b > c, так как оба других неравенства b + c >
a
и a +
c
> b выполняются. Для проверки прямоугольности достаточно проверить
только равенство c2
= a2 + b2, так как при a
£
b £ c гипотенузой может быть только
сторона c. В случае тупоугольности
наибольшей стороной может быть только c,
поэтому для существования тупого угла в треугольнике достаточно выполнение
условия c2 >
a2
+ b2. Треугольник будет остроугольным, если
c2
< a2 + b2.
Например, в языке Си, отсортировать три числа можно так:
int mas[3] = {a,b,c};
sort(mas,mas+3);
Язык Паскаль вообще не имеет функций сортировки. Здесь, уже на элементарной
задаче, мы столкнулись с бедностью языка Паскаль. Реализовать сортировку
непосредственно операциями сравнения в этой задаче можно, так как число
переменных не велико. Если бы их было больше – требовалось бы заводить массив и
уже писать один из классических алгоритмов сортировки.
Если мы сможем эффективно отсортировать числа
a,
b,
c, то программа примет вид:
program triangle;
var
a,b,c:integer;
res:string;
begin
readln(a,b,c);
{ отсортировать a,b,c. Имеем: a <= b <= c }
if c >= a + b then res := 'NONE' else
if c*c = a*a + b*b then res := 'RIGHT' else
if c*c < a*a + b*b then res := 'ACUTE' else
res := 'OBTUSE';
writeln(res);
end.
[назад]
|