Найти - Пользователи
Полная версия: Решение системы линейных уравнений
Начало » Центр помощи » Решение системы линейных уравнений
1
Arsenii
Всем привет. Проблема с решением задачи: выдает runtime error на 9 тесте, данные теста недоступны. Вот условия:
Даны числа a, b, c, d, e, f. Решите систему линейных уравнений

ax + by = e

cx + dy = f

Формат ввода

Вводятся 6 чисел a, b, c, d, e, f- коэффициенты уравнений.

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

Вывод программы зависит от вида решения этой системы.

Если система не имеет решений, то программа должна вывести единственное число 0.

Если система имеет бесконечно много решений, каждое из которых имеет вид y=px+q, то программа должна вывести число 1, а затем значения p и q.

Если система имеет единственное решение (x₀,y₀), то программа должна вывести число 2, а затем значения x₀ и y₀.

Если система имеет бесконечно много решений вида x=x₀, y — любое, то программа должна вывести число 3, а затем значение x₀.

Если система имеет бесконечно много решений вида y=y₀, x — любое, то программа должна вывести число 4, а затем значение y₀.

Если любая пара чисел (x,y) является решением, то программа должна вывести число 5.


Вот мой код:

 a = float(input())
b = float(input())
c = float(input())
d = float(input())
e = float(input())
f = float(input())
if a == 0 and b == 0 and c == 0 and d == 0 and e == 0 and f == 0:
    print(5)
elif b == 0 and d == 0:
    if a != 0:
        print(3, e / a)
    else:
        print(3, f / c)
elif a == 0 and c == 0:
    if b != 0:
        print(4, e / b)
    else:
        print(4, f / d)
elif a * d == b * c and a * f == c * e:
    if b != 0:
        print(1, -a / b, e / b)
    else:
        print(1, -c / d, f / d)
elif a * d == b * c and a * f != c * e:
    print(0)
else:
    x = (e * d - b * f) / (a * d - b * c)
    y = (a * f - e * c) / (a * d - b * c)
    print(2, x, y)
scidam
Не знаю в этом ли причина имеено runtime error, но
предположим, что у вас a,b,c,d = 0, а e,f != 0,
в этом случае у нас нет решений, т.е. по условию задачи мы должны в этом случае вывести 0.

А теперь посмотрим по какой ветке if в этом случае пойдут вычисления по данному коду:

В этом случае условие

 elif b == 0 and d == 0:

удовлетворяется, и ответ программы будет

 print(3, f / c)

что соответствует случаю, когда система имеет много решений. Это уже неверно.
Вот и ZeroDivisionError: division by zero, т.к. с = 0.





Arsenii
Большое спасибо, тест 9 пройден. Теперь застрял на 27 тесте. У меня уже голова не может эффективно придумывать тесты и редактировать код, помогите, если не трудно. Вот исправленный вариант кода:
 a = float(input())
b = float(input())
c = float(input())
d = float(input())
e = float(input())
f = float(input())
if a == 0 and b == 0 and c == 0 and d == 0 and e == 0 and f == 0:
    print(5)
elif a * d == b * c and a * f != c * e:
    print(0)
elif a == 0 and b == 0 and e != 0:
    print(0)
elif c == 0 and d == 0 and f != 0:
    print(0)
elif a * d == b * c and a * f == c * e:
    if b == 0 and d == 0:
        if a != 0 and c != 0:
            print(3, e / a)
        elif a == 0:
            if e == 0:
                print(3, f / c)
        elif c == 0:
            if f == 0:
                print(3, e / a)
    elif a == 0 and c == 0:
        if b != 0:
            print(4, e / b)
        elif d != 0:
            print(4, f / d)
    elif b != 0:
        print(1, -a / b, e / b)
    elif d != 0:
        print(1, -c / d, f / d)
else:
    x = (e * d - b * f) / (a * d - b * c)
    y = (a * f - e * c) / (a * d - b * c)
    print(2, x, y)
vic57
а так не проще?
 a = float(input())
b = float(input())
c = float(input())
d = float(input())
e = float(input())
f = float(input())
try:
    x = (e * d - b * f) / (a * d - b * c)
    y = (a * f - e * c) / (a * d - b * c)
    print 'x =',x,'y =',y
except Exception as ex:
    print str(ex)
    print 'a =',a,'b =',b,'c =',c,'d =',d,'e =',e,'f =',f
Arsenii
Мы так пока не умеем(
Arsenii
Разобрался. Если кому интересно, вот код.
 a = float(input())
b = float(input())
c = float(input())
d = float(input())
e = float(input())
f = float(input())
if a == 0 and b == 0 and c == 0 and d == 0 and e == 0 and f == 0:
    print(5)
elif a * d == b * c and a * f != c * e:
    print(0)
elif a == 0 and b == 0 and e != 0:
    print(0)
elif c == 0 and d == 0 and f != 0:
    print(0)
elif a == 0 and c == 0 and b * f != d * e:
    print(0)
elif b == 0 and d == 0 and a * f != c * e:
    print(0)
elif a * d == b * c and a * f == c * e:
    if b == 0 and d == 0:
        if a != 0 and c != 0:
            print(3, e / a)
        elif a == 0:
            if e == 0:
                print(3, f / c)
        elif c == 0:
            if f == 0:
                print(3, e / a)
    elif a == 0 and c == 0:
        if b != 0:
            print(4, e / b)
        elif d != 0:
            print(4, f / d)
    elif b != 0:
        print(1, -a / b, e / b)
    elif d != 0:
        print(1, -c / d, f / d)
else:
    x = (e * d - b * f) / (a * d - b * c)
    y = (a * f - e * c) / (a * d - b * c)
    print(2, x, y)
Fley
Данная задача есть в тренировках Яндекса по алгоритмам 1.0, решается с помощью метода Крамера чуть короче:

 def solution(a, b, c, d, e, f):
    delta = a * d - b * c
    delta_x = e * d - b * f
    delta_y = a * f - c * e
    if delta == 0:
        if a == b == c == d == e == f == 0:
            return [5]
        elif a == b == 0 and e != 0:
            return [0]
        elif c == d == 0 and f != 0:
            return [0]
        elif delta_x == 0:
            if a == c == 0:
                return 4, f / d if b == 0 else e / b
            elif b == d == 0:
                return (3, f / c if a == 0 else e / a) if delta_y == 0 else [0]
            else:
                return (1, - a / b, e / b) if d == 0 else (1, - c / d, f / d)
        else:
            return [0]
    else:
        return 2, delta_x / delta, delta_y / delta
print(*solution(*[float(input()) for _ in range(6)]))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB