Подскажите алгоритм для проставления арифметических скобок между числами?
Привет.
Ломаю голову над алгоритмом - может кто знает!?
Задачка на логику. Есть n-чисел ( n1, n2, n3, ...., n_мах) и их результат Rez, нужно проставить арифметические операции между ними и скобки, таким образом, что-бы получить результат.
Например: (( n1 + n2 ) * n3 ) / n_мах = Rez.
Как правильно организовать функцию по проставление скобок?
Ломаю голову над алгоритмом - может кто знает!?
Задачка на логику. Есть n-чисел ( n1, n2, n3, ...., n_мах) и их результат Rez, нужно проставить арифметические операции между ними и скобки, таким образом, что-бы получить результат.
Например: (( n1 + n2 ) * n3 ) / n_мах = Rez.
Как правильно организовать функцию по проставление скобок?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) DJDUH, Ничего непонятно.
Попробую своими словами: Необходимо сформировать текст формулы (равенства) так чтобы заданные n-чисел с помощью арифметических преобразований равнялись заданному числу Rez.
Например.
Задано: n1=2, n2=3, n3=1,5, n4=7,5, Rez=1.
Должны получить в виде одного из вариантов: (( n1 + n2 ) * n3 ) / n4 = Rez.
Так?
Тогда боюсь только перебором возможных комбинаций, благо их должно быть не так много в случае небольшого количества чисел.
Попробую своими словами: Необходимо сформировать текст формулы (равенства) так чтобы заданные n-чисел с помощью арифметических преобразований равнялись заданному числу Rez.
Например.
Задано: n1=2, n2=3, n3=1,5, n4=7,5, Rez=1.
Должны получить в виде одного из вариантов: (( n1 + n2 ) * n3 ) / n4 = Rez.
Так?
Тогда боюсь только перебором возможных комбинаций, благо их должно быть не так много в случае небольшого количества чисел.
(1) Вы пишите "Ломаю голову над алгоритмом - может кто знает!?"
Занятие похвальное.
"Как правильно организовать функцию по проставление скобок?"
Примерно так:
Занятие похвальное.
"Как правильно организовать функцию по проставление скобок?"
Примерно так:
Функция СрываГоловы(МассивЪ)
Результат = 0;
Позиция = 0;
Для Каждого Ять Из МассивЪ Цикл
Позиция = Позиция+1;
Если Позиция=1 Тогда
А1 = Ять;
ИначеЕсли Позиция=2 Тогда
А2 = Ять;
ИначеЕсли Позиция=3 Тогда
А3 = Ять;
Результат = Результат + ((А1+А2)*А3)/МассивЪ.Количество();
Позиция = 0;
КонецЕсли;
КонецЦикла;
Возврат Результат*0;
КонецФункции
Показать
(6) CaptainMorgan, Не совсем то, что мне нужно.
Необходимо расставить арифметические знаки и скобки между числами, для получения результата.
Числа n1, n2, n3, n4 и их результат Rez.
Например:
ВариантN1 = n1 + n2 + n3 + n4;
ВариантN2 = n1 - n2 * n3 / n4;
..............................
ВариантNm = ( n1 / ( n2 - n3 ) ) / n4.
Как написать рекурсию для проставления и операций, и скобок между числами?
Необходимо расставить арифметические знаки и скобки между числами, для получения результата.
Числа n1, n2, n3, n4 и их результат Rez.
Например:
ВариантN1 = n1 + n2 + n3 + n4;
ВариантN2 = n1 - n2 * n3 / n4;
..............................
ВариантNm = ( n1 / ( n2 - n3 ) ) / n4.
Как написать рекурсию для проставления и операций, и скобок между числами?
(7) DJDUH, вот готовая функция Она генерирует все формулы для заданного диапазона номеров аргументов. Для 5-ти аргументов получается 36 288 разных формул.
Логика примерно такая: Цепочка аргументов разными способами разбивается на две части: операцией между первым и вторым, вторым и третьим, третьим и четвертым и т.д. аргументами. Варианты формул для левой и правой части цепочки вычисляются рекурсивно. Затем варианты комбинируются, конкатенируясь с тремя (!!!) разными вариантами соединяющих их операций. Скобки обрамляют результат. Когда диапазон номеров аргументов сужается до одного, возвращается два варианта nK и (-nK). Знак "-" представляет некоторую сложность, поскольку минус может быть унарной операцией. Поэтому сделано именно так. Лишние скобки вычислениям не мешают.
Функция СписокФормул(От, До)
Результат = Новый СписокЗначений;
Если От >= До Тогда
Результат.Добавить("n" + От);
Результат.Добавить("(-n" + От + ")")
Иначе
Для Сч = От По До - 1 Цикл
Для каждого Слева Из СписокФормул(От, Сч) Цикл
Для каждого Справа Из СписокФормул(Сч + 1, До) Цикл
Для Оп = 1 По 3 Цикл
Результат.Добавить("(" + Слева + Сред("+*/", Оп, 1) + Справа + ")")
КонецЦикла
КонецЦикла
КонецЦикла
КонецЦикла
КонецЕсли;
Возврат Результат
КонецФункции // СписокФормул()
ПоказатьЛогика примерно такая: Цепочка аргументов разными способами разбивается на две части: операцией между первым и вторым, вторым и третьим, третьим и четвертым и т.д. аргументами. Варианты формул для левой и правой части цепочки вычисляются рекурсивно. Затем варианты комбинируются, конкатенируясь с тремя (!!!) разными вариантами соединяющих их операций. Скобки обрамляют результат. Когда диапазон номеров аргументов сужается до одного, возвращается два варианта nK и (-nK). Знак "-" представляет некоторую сложность, поскольку минус может быть унарной операцией. Поэтому сделано именно так. Лишние скобки вычислениям не мешают.
Прикрепленные файлы:
(12) DJDUH, могу только предположить, что у вас ошибочно расширена область видимости переменных Результат, Сч, Оп в том модуле, в который вы вставляете функцию. Это может быть, например, при наличии В МОДУЛЕ операторов типа Перем Результат или при наличии реквизита с таким именем. Попробуйте вот такой вариант: Если не получится, пришлите, пожалуйста всю обработку, которой вы тестируете функцию, посмотрю. А я прилагаю ту обработку, которой тестировал я.
Функция СписокФормул(От, До)
Перем Результат, Сч, Оп; // для безопасности
Результат = Новый СписокЗначений;
Если От >= До Тогда
Результат.Добавить("n" + От);
Результат.Добавить("( - n" + От + ")")
Иначе
Для Сч = От По До - 1 Цикл
ПравыеЧасти = СписокФормул(Сч + 1, До); // для скорости
Для каждого Слева Из СписокФормул(От, Сч) Цикл
Для каждого Справа Из ПравыеЧасти Цикл
Для Оп = 1 По 3 Цикл
Результат.Добавить("(" + Слева + " " + Сред("+*/", Оп, 1) + " " + Справа + ")")
КонецЦикла
КонецЦикла
КонецЦикла
КонецЦикла
КонецЕсли;
Возврат Результат
КонецФункции // СписокФормул()
ПоказатьПрикрепленные файлы:
СписокФормул.erf
(13) ildarovich, Спасибо, всё получилось!
Как и просили прикрепил обработку. Может по оптимизации она и не проходит, но работает)))
Как и просили прикрепил обработку. Может по оптимизации она и не проходит, но работает)))
Прикрепленные файлы:
СчиталкаДляВлада®.epf
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот