Дан треугольник. Определите величину самого большого из
его углов.
Вход. Координаты
трех вершин треугольника (сначала координаты первой вершины, затем второй,
затем третьей). Координатами является пара целых чисел, не превосходящих 104
по модулю.
Выход. Выведите величину самого большого угла
треугольника в градусах с точностью не меньше 6 знаков после запятой.
Пример входа |
Пример выхода |
0 0 3 0 0 4 |
90.000000 |
геометрия
Анализ алгоритма
Сначала найдем длины сторон треугольника a, b, c, после
чего по теореме косинусов
a2 = b2 + c2
– 2 * b * c * cos ∠BAC
вычислим и его углы. Остается найти из трех углов
наибольший.
Напомним, что расстояние dAB между точками A(x1, y1)
и B(x2, y2) равно
dAB =
Пример
Треугольник, заданный в условии задачи, имеет вид:
Наибольший угол треугольника равен 90º.
Реализация
алгоритма
Углы треугольника в градусах будем сохранять в массиве angles.
double angles[3];
Читаем координаты вершин треугольника. Вычисляем длины его
сторон a, b, c.
scanf("%d
%d %d %d %d %d",&x_1,&y_1,&x_2,&y_2,&x_3,&y_3);
a = sqrt((x_2
- x_1)*(x_2 - x_1) + (y_2 - y_1)*(y_2 - y_1));
b = sqrt((x_2 - x_3)*(x_2 - x_3) +
(y_2 - y_3)*(y_2 - y_3));
c = sqrt((x_3 - x_1)*(x_3 - x_1) +
(y_3 - y_1)*(y_3 - y_1));
Вычисляем
углы треугольника по теореме косинусов. Преобразуем значения углов из радиан в
градусы.
angles[0] = acos((b*b + c*c - a*a)
/ (2*b*c)); angles[0] *= 180 / PI;
angles[1] = acos((a*a + b*b - c*c)
/ (2*a*b)); angles[1] *= 180 / PI;
angles[2] = acos((a*a + c*c - b*b)
/ (2*a*c)); angles[2] *= 180 / PI;
Находим величину наибольшего угла mx и выводим ее.
for(mx = i = 0; i < 3; i++)
if (angles[i] > mx) mx = angles[i];
printf("%.6lf\n",mx);
Java реализация
import java.util.*;
public class Main
{
static double angles[] = new double[3];
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
int x1 =
con.nextInt(), y1 = con.nextInt();
int x2 =
con.nextInt(), y2 = con.nextInt();
int x3 =
con.nextInt(), y3 = con.nextInt();
double a = Math.sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
double b = Math.sqrt((x2 - x3)*(x2 - x3) + (y2 - y3)*(y2 - y3));
double c = Math.sqrt((x3 - x1)*(x3 - x1) + (y3 - y1)*(y3 - y1));
angles[0] = Math.acos((b*b + c*c - a*a) / (2*b*c));
angles[0] *= 180 / Math.PI;
angles[1] = Math.acos((a*a + b*b - c*c) / (2*a*b));
angles[1] *= 180 / Math.PI;
angles[2] = Math.acos((a*a + c*c - b*b) / (2*a*c));
angles[2] *= 180 / Math.PI;
double max = 0;
for(int i = 0; i < 3; i++)
if
(angles[i] > max) max = angles[i];
System.out.println(max);
con.close();
}
}
Python реализация
import math
x1, y1 = map(float,input().split())
x2, y2 = map(float,input().split())
x3, y3 = map(float,input().split())
a = math.sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1))
b = math.sqrt((x2 - x3)*(x2 - x3) + (y2 - y3)*(y2 - y3))
c = math.sqrt((x3 - x1)*(x3 - x1) + (y3 - y1)*(y3 - y1))
angles = [math.acos((b*b + c*c - a*a) / (2*b*c)),
math.acos((a*a + b*b - c*c) / (2*a*b)),
math.acos((a*a + c*c - b*b) / (2*a*c))]
angles = [x * 180 / math.pi for
x in angles]
print("%.6f"
%max(angles))