При заданном линейном уравнении задача состоит в том, чтобы найти значение используемой переменной. Уравнение содержит только операцию «+», «-», переменную и ее коэффициент.
- Если для уравнения нет решения, верните «Нет решения».
- Если для уравнения существуют бесконечные решения, верните «Бесконечные решения».
- Если для уравнения есть только одно решение, убедитесь, что значение x является целым числом.
Примеры :
Подход: идея состоит в том, чтобы использовать два указателя для обновления двух параметров: коэффициента используемой переменной и общей суммы. С левой и правой стороны от «=» используйте противоположные знаки для каждого числа, о котором заботится переменная знака, которая будет переворачиваться, как только будет видно «=».
Теперь, в случае единственного решения, соотношение эффективной суммы и коэффициента дает требуемый результат. В случае бесконечных решений как эффективный итог, так и коэффициент оказываются равными нулю, например, x + 1 = x + 1. В случае отсутствия решения коэффициент x оказывается равным нулю, но эффективный итог ненулевой ,
// Программа CPP для решения заданного уравнения
#include
using namespace std;
// Функция для решения заданного уравнения
string solveEquation(string equation)
<
int n = equation.size(), sign = 1, coeff = 0;
int total = 0, i = 0;
for ( int j = 0; j
if (equation[j] == ‘+’ || equation[j] == ‘-‘ ) <
total += sign * stoi(equation.substr(i, j — i));
// Для таких случаев, как: х, -х, + х
else if (equation[j] == ‘x’ ) <
if ((i == j) || equation[j — 1] == ‘+’ )
else if (equation[j — 1] == ‘-‘ )
coeff += sign * stoi(equation.substr(i, j — i));
// Отразить знак один раз ‘=’
else if (equation[j] == ‘=’ ) <
total += sign * stoi(equation.substr(i, j — i));
// В конце может остаться номер
total += sign * stoi(equation.substr(i));
// Для бесконечных решений
if (coeff == 0 && total == 0)
return «Infinite solutions» ;
if (coeff == 0 && total)
return «No solution» ;
// х = общая сумма / коэффициент х
// ‘-‘ знак указывает на перемещение
// числовое значение справа
int ans = -total / coeff;
return «x=» + to_string(ans);
string equation = «x+5-3+x=6+x-2» ;
// Java-программа для решения
// данное уравнение
<
// Функция для решения
// данное уравнение
static String solveEquation(String equation)
Видео:Java Линейный алгоритм 1Скачать
Метод Гаусса на Java
Статья посвящена реализации алгоритма Гаусса для решения системы линейных алгебраических уравнений на языке Java.
Видео:Java - урок 5.4 (Практика - решаем квадратное уравнение)Скачать
Теоретические сведения
Рассмотрим математическую теорию. Система линейных уравнений может иметь одно решение, бесконечно много решений или же быть несовместной (не иметь решений). Не все методы решения СЛАУ могут справится с вторым случаем, когда система имеет бесконечно много решений. Например, метод Крамера и матричный метод не применимы, но метод Гаусса вполне можно использовать.
Алгоритм можно условно разделить на два этапа:
- Прямой ход
- Обратный ход
В первом этапе образуются нули ниже или выше главной диагонали, за счет использования элементарных преобразований матрицы. На втором этапе находят неизвестные начиная с конца. Подробную теорию можно посмотреть по ссылке: метод Гаусса, поэтому с теорией пожалуй все. Перейдем к реализации.
Видео:ЛИНЕЙНЫЕ УРАВНЕНИЯ - Как решать линейные уравнения // Подготовка к ЕГЭ по МатематикеСкачать
Реализация
Начнем с постановки задачи:
- нам нужно создать программу, реализующую систему линейных уравнений в виде некоторой структуры данных, используя приемы обобщенного программирования. Система должна содержать коэффициенты производного типа от класса Number (т.е. Float, Integer, Double и т.д.)
- Запрограммировать алгоритм, который получив на вход структуру данных системы образует нули ниже главной диагонали
Начнем с написания интерфейса, который должно реализовывать каждое уравнение:
Здесь все должно быть ясно, N некоторый наследник Number‘а, T — некоторый тип, реализующий данный интерфейс (рекурсивные дженерики). Метод addEquation(T item) позволяет прибавить каждый элемент уравнения item к каждому своему элементу. Остальные методы работают аналогично.
Теперь рассмотрим класс системы уравнений. Как видно в листинге ниже, он дженеризирован так же, как и интерфейс Gauss и содержит методы для удобного доступа к приватному списку содержащих в себе уравнений.
Теперь можно приступать к реализации «частного случая» структуры уравнения. Создадим класс MyEquation, реализующий наш интерфейс. Пусть наследником Number‘а будет сверхточный класс Float (на практике лучше брать Double). Обратите внимание, что в методе addEquation(MyEquation item) используется объект класса ListIterator, позволяющий изменять элементы перебираемого списка.
Теперь имеем полноценную структуру данных, реализующую систему уравнений. Составим алгоритм который будет принимать некоторый объект, реализующий интерфейс Gauss, затем вызывая нужные методы приведет матрицу к нужному виду.
Алгоритм простой, найти нужный коэффициент, домножить на него i-ю строку (i=0..n-1), и прибавить ее к j-й строке (j=i..n). Заметьте, алгоритм не знает как именно реализуются методы findCoefficient, mul и addEquation, это придает коду бОльшую гибкость, т.к. при потребности изменить способы манипуляции уравнениями (строками), будут изменены только реализации трех вышеупомянутых методов, а главный алгоритм останется нетронутым.
Почти все. Осталось запустить это все в методе main:
Запустим это чудо, что бы проверить корректность работы…
Это все. Исходники можно скачать на github’е.
Видео:Математика без Ху!ни. Метод Гаусса.Скачать
Вывод
Метод Гаусса не очень поддается обобщенному программированию (как видите обратный ход выполнен отдельно), однако вышла своеобразная реализация которая, надеюсь, поможет кому то лучше разобраться в искусстве использования интерфейсов и дженериков.
🔍 Видео
2.2 Итерационные методы решения СЛАУ (Якоби, Зейделя, релаксации)Скачать
Алгоритм Дейкстры. САМОЕ ПОНЯТНОЕ ОБЪЯСНЕНИЕСкачать
Блок-схемы для начинающих (Блок схемы алгоритмов)Скачать
Метод Ньютона (метод касательных) Пример РешенияСкачать
Метод Зейделя Пример РешенияСкачать
Метод Крамера за 3 минуты. Решение системы линейных уравнений - bezbotvyСкачать
VB.net Vs С++. СЛАУ Метод ГауссаСкачать
Уроки Java для начинающих | #6 - Математические операцииСкачать
Cимплексный метод решения задачи линейного программирования (ЗЛП)Скачать
Решение системы уравнений методом ГауссаСкачать
Линейная алгебра, 9 урок, Метод ГауссаСкачать
Алгоритмы. Линейный поиск. Реализация на Python и Java.Скачать
Линейное уравнение с одной переменной. 6 класс.Скачать
Математика это не ИсламСкачать
Линейное уравнение с двумя переменными. 7 класс.Скачать
Алгоритмы. Нахождение корней уравнения методом хордСкачать