Линейное уравнение переставить - PullRequest
2 голосов
/ 11 января 2011

У меня есть формула, показанная ниже,

((((c1+c2)/c3)*c4)-c5+c6)

Этот формат формулы может варьироваться, что означает генерирование этой формулы от конечного пользователя.Это может быть любой формат.мы используем только основные арифметические операции, т. е. +, -, *, / и (, ).

. Я могу выбрать любое одно значение, чтобы выяснить.Если я выберу C3, чтобы узнать значение, формулу необходимо изменить, как показано ниже,

C3 = (c1+c2)*(c4/(c5-c6))

Предложения и идеи приветствуются, пожалуйста.Любой API доступен?

Ответы [ 2 ]

2 голосов
/ 11 января 2011

Я думаю, я бы хотел начать с 2 Коллекций, одна для обозначения левой части уравнения, а другая для правой части.RHS будет начинаться только с одного элемента, всей формулы.Затем начните снимать круглые скобки извне, работая в. И как только каждый элемент становится открытым, добавьте его во 2-ую коллекцию, убедившись, что операция обратная.Затем, как только вы переместите элемент, который вы ищете, начните переходить из второй коллекции обратно в первую.

Поскольку я действительно считаю, что это домашнее задание, я не хочу давать кодовый ответ, но мой вышеперечисленный трюк переводится как «шаг через арифметические преобразования».Итак, чтобы разоблачить C3:

((((c1+c2)/c3)*c4)-c5+c6)
(((c1+c2)/c3)*c4)-c5+c6
(c5 - c6) = (((c1+c2)/c3)*c4)
(c5 - c6) = ((c1+c2)/c3)*c4
((c5 - c6) / c4) = ((c1+c2)/c3)
((c5 - c6) / c4) = (c1+c2)/c3
(c3* ((c5- c6) / c4) = (c1 + c2)
c3* (c5- c6) = (c1 + c2) * c4
c3 = (((c1 + c2) * c4) / (c5 - c6))

Я не совсем уверен, где я ошибся, что мое окончательное уравнение отличается от вашего, но я считаю, что я бы выбрал такой подход - проходить через каждое преобразование до тех пор, поканужная переменная выставлена.

1 голос
/ 11 января 2011

Если целевая переменная встречается произвольное количество раз, невозможно (в общем случае) получить формулу.Если он появляется только один раз, алгоритм довольно прост.Сначала преобразуйте формулу в обратную польскую запись.Затем создайте двоичное дерево, которое имеет переменные в листьях и операции во внутренних узлах.(Это действительно просто, когда у вас есть обратная польская запись, почти как расчет выражения, но с числами в стеке вместо чисел.) Обрабатывайте путь от корня до нужного листа, решая самые простые уравнения:

? + c6 = 0
? = 0 - c6
? - c5 = 0 - c6
? = (0 - c6) + c5
? * c4 = (0 - c6) + c5
? = ((0 - c6) + c5) / c4
(c1+c2)/? = ((0 - c6) + c5) / c4
? = (c1+c2) / (((0 - c6) + c5) / c4)
c3 = (c1+c2) / (((0 - c6) + c5) / c4)

Здесь я обозначен?поддерево, содержащее целевую переменную.Обратите внимание, что каждое уравнение, которое вам нужно решить, имеет форму (...) op?= (...) и, следовательно, решается очевидным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...