![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
&y JOKER |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 2 Регистрация: 15.9.2009 Город: Chelyabinsk city Учебное заведение: слава Богу, уже закончил ;) Вы: другое ![]() |
Здравствуйте!
Я не студент и не математик,и даже не программер,а просто интересующийся различными сферами деятельности. Возникла необходимость написать софтинку, которая бы раскладывала число на составляющие по заданному уравнению: дано число S, которое может принмать значения от 8 до 234881024 S=x*(y*(4+z1)+4+z2)+z3 , где x может принимать значение от 1 до 255 y - от 1 до 65535 z1,z2,z3 - от нуля, до 20 Имея на входе значение S необходимо вычислить: x,y,z1,z2,z3 Хотя-бы одно из множеств решений. Вариант перебора отпадает - это некрасиво как-то и неинтересно. (IMG:style_emoticons/default/smile.gif) Была мысль начать с того, на какие числа вообще делится S, но это опять-же только перебором. Поэтому у меня вопрос к профессионалам, возможно-ли это решить красиво и каким образом? (IMG:style_emoticons/default/smile.gif) Спасибо! p.s. прошу прощения если не в тот топик, просто я не знаю что такое дифуры и относится-ли к ним моя задача. |
![]() ![]() |
kaa |
![]()
Сообщение
#2
|
Аспирант ![]() ![]() ![]() Группа: Активисты Сообщений: 422 Регистрация: 7.1.2009 Город: Украина Киев Вы: школьник ![]() |
с каждого промежутка можно выбрать любое число)и подставить в формулу)
|
тень |
![]()
Сообщение
#3
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 135 Регистрация: 10.9.2009 Город: москва ![]() |
Хорошая задача для линейного или нелинелийногопрограммирования. грубо говоря оптимизации.
Зайдите на Excel, вызовите solver, сформулируйте и через секунду получите ответ. |
tig81 |
![]()
Сообщение
#4
|
Академик ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 15 617 Регистрация: 15.12.2007 Город: Украина, Запорожье Учебное заведение: ЗНУ Вы: преподаватель ![]() |
|
&y JOKER |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 2 Регистрация: 15.9.2009 Город: Chelyabinsk city Учебное заведение: слава Богу, уже закончил ;) Вы: другое ![]() |
Цитата Дифуры не знаете, а вот дифференциальные уравнения "сократили" правильно. ну это вот единственнное, чему меня научили в ВУЗе. (IMG:style_emoticons/default/smile.gif) формула претерпела некоторые изменения, но суть осталась та-же: S=(x*((y*(4+z1))+5+z2))+1+z3 в общем, алгоритм получился примерно следующий: 1. находим x перебором от 1 до 255 и z3 от 0 до 10 проверяем делится-ли (S-1-z3) на x без остатка и находится-ли частное n в пределе 65535. Таким образом нашли x, z3 и частное n. 2. получается: S=(x*n)+1+z3. Далее работаем с n. перебором z1 и z2 от 0 до 10 проверяем целочисленное деление выражения: y=n-5-z2/(4+z1) И вроде-бы все работает замечательно, но только в пределах до значаения S=9387296. Далее, диапазон "поправочного" коэфф. z3 приходится увеличивать, что собссно не есть гуд. (IMG:style_emoticons/default/sad.gif) |
тень |
![]()
Сообщение
#6
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 135 Регистрация: 10.9.2009 Город: москва ![]() |
составляете функцию abs(S- ваша формула.) (
Задаете произвольный набор исходных переменных внутри разрешенной области 1. изменяете первую переменную на +1 -если функция уменьшается продолжаете увеличивать первую переменную до тех пор пока она не начнет увеличиваться или вы не упретесь в ограничение - если увеличилась, то изменяете на -1 и далее как выше 2. Далее последовательно для всех переменных п.1 3. Если любое изменение любых переменных приводит к увеличению функции - найдено решение Метод без производных, проэтому походит abs, иначе лучше использовать квадрат, чтобы сохранить непр. производной |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 8:50 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru