Линейное уравнение с 3 переменными в C - PullRequest
0 голосов
/ 15 ноября 2018

Мне дано домашнее задание класса С, которое:

Гиперконтурная дорожка состоит из отдельных отрезков трубы определенной длины.Трасса начинается и заканчивается переборкой, и между каждыми двумя отрезками трубы имеется переборка.Сегменты производятся двумя разными производителями (s1 и s2).Даны отрезки (s1, s2), переборки (b) и желаемой дорожки (l).Задача состоит в том, чтобы разработать функцию, которая на основе этих 4 параметров решит, существуют ли допустимые комбинации сегментов и переборок, которые приведут к точной длине желаемой дорожки, и, если они есть, выведет количество этих комбинаций..

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

Мое мнение таково, что я должен решить линейное уравнение с 3 переменными:

(m) * s1 + (n) * s2 + (m + n + 1) * b = l

Но я не знаю, какой метод использовать для написания эффективного кода.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Прежде всего, посмотрите на ваш строительный проект по-другому:

  • Вы должны начать с переборки.
  • После этого каждая труба должна иметь переборкупосле него.

Таким образом, вам нужно построить дорожку длиной l-b с трубами длиной m+b и n+b.

Перераспределить факторы, и вы 'Вы обнаружите, что у вас есть уравнение из двух переменных, а не 3:

(m+b)*s1 + (n+b)*s2 = l-b

Без ограничения общности предположим, что s2> s1.Ваша дорожка будет нуждаться как минимум (нижняя граница) в таком количестве сегментов трубы, достаточно длинного, чтобы достичь хотя бы необходимой длины дорожки.

ceil( (l-b) / (n+b) )

и не более (верхняя граница), чем

floor( (l-b) / (m+b) )

Вы можете перебрать итеративное решение:

  • решить уравнение для s2
  • итерировать s1 в указанном выше диапазоне
  • для каждогозначение s1, посмотрите, является ли s2 целым числом.Если это так, запишите решение.

Это просто, но не элегантно.В действительности вы захотите использовать соответствующую работу по линейным диофантовым уравнениям для параметризации всех решений с s1, s2 >= 0.

0 голосов
/ 15 ноября 2018

Уравнение предоставляет критерии для поиска комбинаций.При написании c-кода для этого потребуется только итерация для m и n и проверка, соответствует ли она длине l.Ниже приведен псевдокод, который может содержать комбинации

for m = 0 to l/s1
for n = 0 to l/s2
bnum = m + n - 1
if (m*s1 + n*s2 + bnum*b) == l)
print m, n, bnum
...