0

Формат входных данных

Даны три натуральных числа – стороны треугольника. Каждое число вводится с новой строки.

Формат выходных данных:

*Необходимо вывести одно из слов:

right для прямоугольного треугольника,

acute для остроугольного треугольника,

obtuse для тупоугольного треугольника,

impossible, если треугольника с такими сторонами не существует.*

Я запускаю вот такой код:

x=int(input())
y=int(input())
z=int(input())
c = max(x,y,z)
if c==x:
    a, b =  y, z
elif c==y:
    a,b=x,z
else:
    a, b = x, y

if c>=a+b: print('impossible') else: if c^2==(a^2+b^2): print('right') elif c^2<(a^2+b^2): print('acute') else: print('obtuse')

Для входных чисел 8 10 6

Выдаётся результат: "obtuse", хотя правильно "right". Скажите, пожалуйста, что я делаю неправильно?

Nowhere Man
  • 15,995
  • 33
  • 19
  • 29
  • Возможный дубликат вопроса: Что делает оператор "^" в Python? – Nowhere Man Feb 14 '24 at 15:33
  • 2
    Оператор ^ не имеет никакого отношения к возведению в степень в питоне и в массе других языков, это побитовая операция XOR (исключающее ИЛИ). Возведение в степень в питоне выполняется при помощи оператора **, для квадрата можно было бы просто записать if c * c == a * a + b * b: – Nowhere Man Feb 14 '24 at 15:35

2 Answers2

2

Проблема в вашем текущем коде связана с использованием оператора побитового исключающего ИЛИ ^ вместо оператора возведения в квадрат **

Вот исправленный вариант вашего кода, где я заменил ^ на ** для возведения чисел в квадрат:

x = int(input())
y = int(input())
z = int(input())
c = max(x, y, z)

if c == x: a, b = y, z elif c == y: a, b = x, z else: a, b = x, y

if c >= a + b: print('impossible') else: if c ** 2 == (a ** 2 + b ** 2): print('right') elif c ** 2 < (a ** 2 + b ** 2): print('acute') else: print('obtuse')

Vladyslav
  • 446
  • У вас код не приложен. – Volk Feb 14 '24 at 15:30
  • a, b, c = sorted((x, y, z)). – Stanislav Volodarskiy Feb 14 '24 at 15:43
  • А это "if c == x:" зачем? Достаточно определить только самую длинную сторону. – rotabor Feb 14 '24 at 16:16
  • @StanislavVolodarskiy лишнее. "c = max" достаточно. – rotabor Feb 14 '24 at 16:18
  • @rotabor, если не менять сравнения в конце, то кроме c нужно выделить a и b. sorted хотя и делает лишнюю работу, зато размещает все значения по своим местам в один оператор. – Stanislav Volodarskiy Feb 14 '24 at 16:28
  • @StanislavVolodarskiy В конце чего? Даже если не вдаваться в теорию, а посмотреть на код, начиная с "if c >= a + b:", то обмен местами a и b ничего не меняет. По крайней мере, для этого кода сортировать две короткие стороны не нужно. И по теории тоже не нужно. – rotabor Feb 14 '24 at 16:43
  • @c >= a + b, в операторе if c >= a + b вам нужны и c и a и b. Если просто выделить c = max(...), то понадобятся условные операторы для заполнения a и b. Я предложил sorted чтобы избавиться от блока кода со строки if c == x:. – Stanislav Volodarskiy Feb 14 '24 at 16:52
  • @StanislavVolodarskiy ну да, это я провтыкал – rotabor Feb 14 '24 at 17:08
  • @rotabor, но есть хулиганский способ поменять формулы. Все сравнения можно переписать в терминах c, x, y, z без выделения в отдельные переменные двух меньших значений. Но это уже из разряда ненормального программирования. – Stanislav Volodarskiy Feb 14 '24 at 17:12
  • @StanislavVolodarskiy нашёл вариант без хулиганства – rotabor Feb 14 '24 at 19:43
  • @rotabor, добавил ответ. В конце вариант без сортировки и выделения a и b. – Stanislav Volodarskiy Feb 14 '24 at 21:23
2

Оператор ^ в Питоне - это XOR. Для возведения в степень используется оператор **. Ниже ваша программа с минимальными исправлениями:

x = int(input())
y = int(input())
z = int(input())
c = max(x, y, z)

if c == x: a, b = y, z elif c == y: a, b = x, z else: a, b = x, y

if c >= a + b: print('impossible') else: if c ** 2 == a ** 2 + b ** 2: print('right') elif c ** 2 < a ** 2 + b ** 2: print('acute') else: print('obtuse')

Её можно переписать проще:

a, b, c = sorted(int(input()) for _ in range(3))

if c >= a + b: print('impossible') else: residual = c ** 2 - a ** 2 - b ** 2 if residual == 0: print('right') elif residual < 0: print('acute') else: print('obtuse')

И ещё есть хулиганский способ без сортировки:

sides = [int(input()) for _ in range(3)]
c = max(sides)

if 2 * c >= sum(sides): print('impossible') else: residual = 2 * c ** 2 - sum(v ** 2 for v in sides) if residual == 0: print('right') elif residual < 0: print('acute') else: print('obtuse')

  • Почему же хулиганский? Очень даже хороший, на 5. – rotabor Feb 14 '24 at 22:54
  • @rotabor, хулиганский потому что неравенство треугольника и теорема косинусов используются но не видны явно. Кода сделан неочевидным чтобы упростить обработку входных данные. – Stanislav Volodarskiy Feb 15 '24 at 10:53