Код выдаёт неправильный ответ. Задача: Определите тип треугольника (остроугольный, тупоугольный, прямоугольный) с данными сторонами

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

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

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

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

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". Скажите, пожалуйста, что я делаю неправильно?


Ответы (2 шт):

Автор решения: Vladyslav

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

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

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')
→ Ссылка
Автор решения: Stanislav Volodarskiy

Оператор ^ в Питоне - это 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')
→ Ссылка