Подтема 7 из 7 · дополнительный урок
Тройка как стороны треугольника
Когда три числа могут быть сторонами треугольника и как узнать, прямоугольный он, остроугольный или тупоугольный.
Дополнительный урок
Дополнительный урок — для продвинутых. Изредка в задании 17 спрашивают тройки, которые могут быть сторонами треугольника. Задачи основных подтем решаются без него.
Например: «определите количество троек, которые могут быть сторонами прямоугольного треугольника, затем максимальную из сумм элементов таких троек». Перебор троек и ответ — те же, что в задаче темы, меняется только проверка. Её разберём на тройках 3, 4, 5; 2, 3, 4 и 1, 2, 3 — стороны, которые легко нарисовать.
Существование
Из любых ли трёх чисел можно сложить треугольник?
Нет. Упорядочим стороны: p ≤ q ≤ r. Треугольник есть, только если две меньшие стороны вместе длиннее большей: p + q > r. Положим две меньшие стороны вдоль большей:
Остальные две проверки — p + r > q и q + r > p — после сортировки выполняются сами: к стороне прибавляют самую длинную, и сумма заведомо больше. Поэтому тройку сначала сортируют, а потом проверяют одно неравенство.
Вид треугольника
Как узнать, прямоугольный треугольник, остроугольный или тупоугольный?
Сравни сумму квадратов двух меньших сторон с квадратом большей. Равенство — это теорема Пифагора, прямой угол. Если сумма больше, все углы острые, если меньше — угол напротив большей стороны тупой:
- прямоугольный
- p² + q² = r²3, 4, 5: 9 + 16 = 25
- остроугольный
- p² + q² > r²4, 5, 6: 16 + 25 = 41 > 36
- тупоугольный
- p² + q² < r²2, 3, 4: 4 + 9 = 13 < 16
Обоснование · необязательноПочему острый и тупой угол различает квадрат большей стороны
Представь, что две меньшие стороны закреплены, а угол между ними раскрывается. Чем шире угол, тем длиннее третья сторона. При прямом угле её квадрат ровно равен p² + q², при остром угле сторона короче, при тупом — длиннее.
Проверим все случаи программой — сначала существование, потом вид:
for t in [[3, 4, 5], [4, 5, 6], [2, 3, 4], [1, 2, 3]]: p, q, r = sorted(t) if not (p > 0 and p + q > r): print(t, "треугольника нет") elif p ** 2 + q ** 2 == r ** 2: print(t, "прямоугольный") elif p ** 2 + q ** 2 > r ** 2: print(t, "остроугольный") else: print(t, "тупоугольный")Прямоугольный
Зачем проверять существование, если равенство Пифагора уже выполнено?
Равенство выполняется и у троек, из которых треугольник не сложить. Например, 0, 5, 5: 0² + 5² = 5², но стороны длины ноль не бывает. Такую тройку отсекает неравенство: 0 + 5 = 5, а не больше. Пусть по условию, если подходящих троек нет, нужно вывести 0 0:
a = [5, 12, 13, 0, 5, 5]sums = []for i in range(len(a) - 2): p, q, r = sorted([a[i], a[i + 1], a[i + 2]]) is_triangle = p > 0 and p + q > r is_right = p ** 2 + q ** 2 == r ** 2 if is_triangle and is_right: sums.append(p + q + r)if len(sums) == 0: print(0, 0)else: print(len(sums), max(sums))Подходит только 5, 12, 13. У последней тройки 0, 5, 5 равенство выполнено, но is_triangle ложно — без этой проверки программа вывела бы 2 30.
Итого
- Сортировка
p, q, r = sorted(t): p ≤ q ≤ r - Существованиеp + q > r — две другие проверки выполняются сами
- Прямоугольныйp² + q² = r²
- Остроугольныйp² + q² > r²
- Тупоугольныйp² + q² < r²
- 0, 5, 5равенство Пифагора без проверки существования ошибается
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Тупоугольные тройки
Последовательность 10, 6, 8, 3, 4, 5, 13. Найди количество соседних троек, которые могут быть сторонами тупоугольного треугольника, и максимальную сумму их элементов.
Введите через пробел количество троек, затем максимальную сумму.
Подсказка
Тупоугольный: треугольник существует и p ** 2 + q ** 2 < r ** 2 для наибольшей стороны r.
Решение
Подходит только 6, 8, 3: 3 + 6 > 8, но 9 + 36 = 45 < 64. Тройки 10, 6, 8 и 3, 4, 5 прямоугольные, у 8, 3, 4 и 4, 5, 13 треугольника нет.
a = [10, 6, 8, 3, 4, 5, 13]sums = []for i in range(len(a) - 2): p, q, r = sorted([a[i], a[i + 1], a[i + 2]]) if p + q > r and p ** 2 + q ** 2 < r ** 2: sums.append(p + q + r)print(len(sums), max(sums))Ответ: 1 17
Остроугольные тройки файла
В файле 17-5.txt содержится последовательность натуральных чисел. Определите количество троек, которые могут являться сторонами остроугольного треугольника, затем максимальную из сумм элементов таких троек. Если таких троек не найдётся, выведите 0 0. Под тройкой подразумевается три идущих подряд элемента.
Введите через пробел количество троек, затем максимальную сумму.
Подсказка
Остроугольный: p + q > r и p ** 2 + q ** 2 > r ** 2 после сортировки тройки.
Решение
Стороны в файле идут в любом порядке, поэтому тройку сортируют.
with open("17-5.txt") as f: a = [int(x) for x in f]sums = []for i in range(len(a) - 2): p, q, r = sorted([a[i], a[i + 1], a[i + 2]]) if p + q > r and p ** 2 + q ** 2 > r ** 2: sums.append(p + q + r)if len(sums) == 0: print(0, 0)else: print(len(sums), max(sums))Ответ: 141 114
Прямоугольные тройки
Последовательность 3, 4, 5, 6, 8, 10. Найди количество соседних троек, которые могут быть сторонами прямоугольного треугольника, и максимальную сумму их элементов.
Введите через пробел количество троек, затем максимальную сумму.
Подсказка
Отсортируй тройку: p + q > r и p ** 2 + q ** 2 == r ** 2.
Решение
Подходят 3, 4, 5 и 6, 8, 10.
a = [3, 4, 5, 6, 8, 10]sums = []for i in range(len(a) - 2): p, q, r = sorted([a[i], a[i + 1], a[i + 2]]) if p + q > r and p ** 2 + q ** 2 == r ** 2: sums.append(p + q + r)print(len(sums), max(sums))Ответ: 2 24
Прямоугольные тройки файла
Для файла 17-5.txt определите количество троек, которые могут являться сторонами прямоугольного треугольника, затем максимальную из сумм элементов таких троек. Если таких троек не найдётся, выведите 0 0.
Введите через пробел количество троек, затем максимальную сумму.
Подсказка
Стороны в файле идут в любом порядке — без сортировки часть троек потеряется.
Решение
После сортировки наибольшая сторона — r, проверка Пифагора сравнивает с её квадратом.
with open("17-5.txt") as f: a = [int(x) for x in f]sums = []for i in range(len(a) - 2): p, q, r = sorted([a[i], a[i + 1], a[i + 2]]) if p + q > r and p ** 2 + q ** 2 == r ** 2: sums.append(p + q + r)if len(sums) == 0: print(0, 0)else: print(len(sums), max(sums))Ответ: 7 280