Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Алгоритмы

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8

Открыть новую тему     Написать ответ в эту тему

akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
все вопросы по алгоритмам, их созданию и сопровождению без привязки к какому-нибудь конкретному языку программирования...
ну или с привязкой :)
дать идею, помочь с математикой или, если вам не помогли в профильном топе...
 
по возможности используйте псевдокод в своих сообщениях
 
ссылки
 
  •  "ebook'и -- сборники алгоритмов"
     


    только помните, что тут никто ничего _делать за вас_ не обязан!
    для этого есть специальные места со своими ценами...

  • Всего записей: 21360 | Зарегистр. 06-12-2002 | Отправлено: 09:28 16-12-2016 | Исправлено: akaGM, 09:03 12-07-2019
    r u b o a r d m a n



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alex_Piggy, ваш код, возможно правильно работает, но проверить на правильность немогу потому что a, b, c, d должны браться из определенного набора, как здесь.
     

    Цитата:
    Набор шестерен гитары:  
    20,20,23,24,25,25,30,33,34,35,37,40,41,43,45,47,48,50,53,55,57,58,59,60,61,62,65,67,70,71,73,75,79,80,83,85,89,90,92,95,97,98,100

     
    Примечание:
    Если не затруднит, листинги желательно на Делфи, в крайнем случае на VBScript, а впрочем как угодно.
    Я на Java листинг давал поскольку для телефона его готовил, а там сами понимаете только Java.
     
    Добавлено:

    Цитата:
    внутри третьего цикла перебора. a, c и b - определены.
    понятно. Неплохо придумано.  
    Все же перебрать 79 507 вариантов это не 3 418 801

    Всего записей: 484 | Зарегистр. 10-09-2014 | Отправлено: 23:11 31-12-2018 | Исправлено: r u b o a r d m a n, 23:26 31-12-2018
    Alex_Piggy

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    r u b o a r d m a n

    Цитата:
    Если не затруднит, листинги желательно на Делфи, в крайнем случае на VBScript, а впрочем как угодно.


    Цитата:
    Набор шестерен гитары:  
     20,20,23,24,25,25,30,33,34,35,37,40,41,43,45,47,48,50,53,55,57,58,59,60,61,62,65,67,70,71,73,75,79,80,83,85,89,90,92,95,97,98,100

    Прошу прощения, не заметил. Изменил значения, выделенные жирным.
    На Delphi  я последний раз лет десять назад писал. Поэтому - увы - VBScript.
    aList - массив возможных шестерней, должен быть отсортирован по возрастанию.
     Подробнее...
    PS. С Новым Годом!

    Всего записей: 1813 | Зарегистр. 07-08-2002 | Отправлено: 01:51 01-01-2019
    r u b o a r d m a n



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alex_Piggy и вас тоже с Новым Годом! Благодарю за помощь, буду тестировать и подгонять, надеюсь что все получится.
     
    По поводу массива перемноженных значений, то не всё так плохо. Накодил тут обновку - теперь варианты ( 2 * 3 ) и ( 3 * 2 ) считаются одинаковыми и один из вариантов отсекается как избыточный. Так же отсекаются варианты (3 * 3) с одинаковыми множителями - т.к. нельзя одну и ту же шестерню использовать два раза. вот что получилось:
    Листинг  
     
    При этом кол-во результатов сократилось с 1849 до 903, то есть почти половина - избыточные.
     
     
    Добавлено:
    Alex_Piggy
    Цитата:
    20,20,23,24,25,25,30,
    Это не ошибка. Они в наборе к этому станку так и идут, две пары одинаковые. У других станков повторяются другие пары. Из чего исходили проектировщики станков я не знаю.
     
     
    Добавлено:
    Что-то не то:

     
    У нас в наборе нет шестерни 26.

    Всего записей: 484 | Зарегистр. 10-09-2014 | Отправлено: 10:17 01-01-2019
    Alex_Piggy

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Доброе время, r u b o a r d m a n

    Цитата:
    нельзя одну и ту же шестерню использовать два раза ...
    Это не ошибка. Они в наборе к этому станку так и идут, две пары одинаковые.  

    Нельзя вообще? Или в одной связке (a-b),(c-d)? Или если нет повтора в списке? То есть для этого станка разрешены ли комбинации (a=20/b=25)*(с=20/d=30)  и  (a=55/b=25)*(с=55/d=30) ?
     

    Цитата:
    При этом кол-во результатов сократилось с 1849 до 903, то есть почти половина - избыточные.

    Вообще это называется комбинаторика. Но нам ее не преподавали. Сам немного разбирался...
    Это называется "Сочетания без повторений из n элементов по k".
    Считается n!/((n-k)! * k!) -  для k=2 формула упрощается до n * (n-1)/2. 43 элемента  A = n * (n-1) = 43*42/2 =  903 варианта (что Вы и получили). Без дубликатов - 41 элемент - A = 41 * 40 / 2 = 820  
    То что я встречал цикл перебора сочетаний без повторений - это и будет то, что предлагал
    for ia := Low(gears) to High(gears) do  for ib := ia+1 to High(gears) do  { loop}
    Только я считал, что c может быть таким же, как и a - поэтому использовал "c=a" (aka ib := ia ) а не "c=a+1".  

    Цитата:
    Листинг  

    Спасибо, этого достаточно. Cтавлю TurboPascal.

    Всего записей: 1813 | Зарегистр. 07-08-2002 | Отправлено: 11:33 01-01-2019
    r u b o a r d m a n



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alex_Piggy
    Цитата:
    Нельзя вообще?
    Точно такую же можно. Именно эту нельзя. Как вы себе ЭТО представляете физически?
     

    Цитата:
    комбинаторика. Но нам ее не преподавали.
    На тоже. А жаль пригодилось бы.
     

    Цитата:
    Cтавлю TurboPascal.
    Да ладно вам.. Это Делфи.
     
    Обновил исходную процедуру, вроде бы и работает, и не работает - читайте комментарии в листинге. Что не так делаю?
    Процедура на Java

    Всего записей: 484 | Зарегистр. 10-09-2014 | Отправлено: 11:57 01-01-2019
    Alex_Piggy

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    r u b o a r d m a n

    Цитата:
    У нас в наборе нет шестерни 26.

    Да. Я думал, что "25,25" - это опечатка и исправил на "25,26". И предупредил, что "Изменил значения, выделенные жирным.". Пожалуйста исправьте в коде обратно.
     

    Цитата:
    Точно такую же можно. Именно эту нельзя. Как вы себе ЭТО представляете физически?

    Точно. Протупил. Тогда циклы для ia ib ic будут так:
    from ia := Low(gears) to High (gears) do
    from ic := ia+1 to High (gears) do  
    from ib := Low(gears) to High (gears) do If  (ib <> ia)  And (ib <> ic) Then If (gears[ib] >= bmin) And (gears[ib] <= bmax) Then
     

    Цитата:
    Да ладно вам.. Это Делфи

    Pascal, Delphi - какая разница? В данном случае? В любом случае у меня ничего такого не стоит.
     

    Цитата:
    Процедура на Java

    То есть Вам таки на Java нужно.
    1. Вы отдельно крутите циклы, и отдельно строка, в которой вы ищете текстовые значения. Не надо так делать. Переведите строку в массив и работайте с индексами.  
    2. (ai*ci)/(bi*di) == u не будет работать. Почитайте, например, https://howtodoinjava.com/java/basics/correctly-compare-float-double/ . Вкратце - если будет отличатся двадцатый знак после запятой - то числа будут считаться разными. Поэтому лучше сравнивать с допуском - например
    Math.abs((ai*ci)/(bi*di) - u) < 0.00001

    Всего записей: 1813 | Зарегистр. 07-08-2002 | Отправлено: 12:32 01-01-2019
    r u b o a r d m a n



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alex_Piggy
    Цитата:
    Math.abs
    На Java это будет работать. А на Java 2Me такой библиотеки не предусмотрено.  
    Так что придётся извращаться.
     

    Всего записей: 484 | Зарегистр. 10-09-2014 | Отправлено: 12:46 01-01-2019
    Alex_Piggy

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    r u b o a r d m a n

    Цитата:
    На Java это будет работать. А на Java 2Me такой библиотеки не предусмотрено.   Так что придётся извращаться.

    Java 2Me какой версии надо? Тогда  
    double ud = (ai*ci)/(bi*di) - u;
    ud=ud<0?-ud:ud;
    if (ud<0.00001) {};

    Всего записей: 1813 | Зарегистр. 07-08-2002 | Отправлено: 12:56 01-01-2019
    r u b o a r d m a n



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Переведите строку в массив и работайте с индексами.
    В проге для ПК я так и делал, а для Java проще искать в строке, иначе надо раздувать код. Впрочем если это корень зла (в чем я не уверен) можно и массив запилить.  
     
    Но мне кажется что дело тут в типе данных:
    ((ai*ci)/(bi*u)) - это по любому вещественный тип (Java говорит что double)
    а вот
    di - это целый тип.
    При переводе значений из вещественного в целый (не забываем что библиотека Math не доступна):
    di = (int)((ai*ci)/(bi*u));
    значение дробной части вместо округления отбрасывается.
    Если же определить di как double, то невозможно будет отыскать это значение в наборе, т.к. все равно придётся округлять к целому - любая шестерня по определению не может иметь 25.3 зуба.
     
    Таким образом, массив НЕ избавит от проблемы.
     
     
    Добавлено:

    Цитата:
    ud=ud<0?-ud:ud;
    Мда паскальщика это ставит в тупик.
    Можете это на VBS повторить? Ну или вкрадце на человечьем языке.

    Всего записей: 484 | Зарегистр. 10-09-2014 | Отправлено: 13:03 01-01-2019 | Исправлено: r u b o a r d m a n, 13:22 01-01-2019
    Alex_Piggy

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    r u b o a r d m a n

    Цитата:
    Таким образом, массив НЕ избавит от проблемы.

    Проблема в постоянной конвертации число/строка. Вычислительные ресурсы.

    Цитата:
    Можете это на VBS повторить?

    На VBA - это IIF, в Pascal - вроде IfThen.
    ud := IfThen(ud<0, -ud, ud)
    Полная форма - "if ud<0 then ud := -ud else ud := ud;"
    Лучше, наверное на java просто: "if (ud<0) ud=-ud"
    Округление можно сделать по тому же приципу:

    Код:
    double d = ((ai*ci)/(bi*u));
    int di = (int)d;
    if (d-di > 0.5) di++;

    UPD: Мне кажется, это здесь уже оффтопик. Давайте или в личку или в другую тему например, JAVA Решение задач . А здесь уже только окончательное решение.

    Всего записей: 1813 | Зарегистр. 07-08-2002 | Отправлено: 13:43 01-01-2019 | Исправлено: Alex_Piggy, 13:48 01-01-2019
    r u b o a r d m a n



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alex_Piggy
    Цитата:
    Проблема в постоянной конвертации число/строка
    В нашем случае это конечно проблема, но не настолько.
    Мидлет таки работает и выдаёт результат (пусть Z = 35) - Щелкните по картинке для увеличения.


    Цитата:
    Мне кажется, это здесь уже оффтопик. Давайте или в личку или в другую тему например, JAVA Решение задач . А здесь уже только окончательное решение.
    Согласен. Лучше в личку.  

    Всего записей: 484 | Зарегистр. 10-09-2014 | Отправлено: 14:10 01-01-2019 | Исправлено: r u b o a r d m a n, 14:50 01-01-2019
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    [q]Задача ставится для моделей поддерживающих Java2ME MIDP 2.0 CLDC 1.1 - это устаревшие модели уроня Nokia 40-й серии.[/q]

    С массивами эта ME умеет работать?
    Если да, то вот код:
    Подробнее...

    Всего записей: 1475 | Зарегистр. 01-11-2004 | Отправлено: 19:19 02-01-2019
    r u b o a r d m a n



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ne_viens, спс, уже решили всё. Респект камраду Alex_Piggy.

    Всего записей: 484 | Зарегистр. 10-09-2014 | Отправлено: 19:56 02-01-2019
    persicum

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как на асме x86 организовать сложение-вычитание modulo 2^32-1 ? Живой ветки по асму не обнаружил.
     
    Сложение:
    add eax,ecx
    adc eax,0
     
    Вычитание:
    sub eax,ecx
    sbb eax,0
     
    Работать будет без косяков?

    Всего записей: 313 | Зарегистр. 27-06-2007 | Отправлено: 19:48 03-01-2019
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Просто add eax,ecx, sub eax,ecx.  
     

    Всего записей: 1475 | Зарегистр. 01-11-2004 | Отправлено: 20:09 03-01-2019
    persicum

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ^
    жесть

    Всего записей: 313 | Зарегистр. 27-06-2007 | Отправлено: 16:25 04-01-2019
    MERCURY127



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Просто add eax,ecx, sub eax,ecx.
    а по моему, это для модуля 2^32 (значения от 0x00000000 до 0xFFFFFFFF), человеку же надо 2^32 -1 (значения от 0x00000000 до 0xFFFFFFFE)...

    Всего записей: 9923 | Зарегистр. 03-08-2008 | Отправлено: 14:13 05-01-2019
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    что такое modulo 2^32-1,
    оставаться в диапазоне 32-битных чисел или shl shr?
     

    Цитата:
    Живой ветки по асму не обнаружил.

    http://forum.ru-board.com/topic.cgi?forum=33&topic=7682#1

    Всего записей: 21360 | Зарегистр. 06-12-2002 | Отправлено: 17:16 05-01-2019
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    а по моему, это для модуля 2^32..

    О, точно, ошибся я.
     
    Не будет  
    add eax,ecx
    adc eax,0
    работать.
     
    0FFFFFFFFh + 0 + c = 0FFFFFFFFh,
    а нужно (0хFFFFFFFF + 0) % 0хFFFFFFFE = 1

    Всего записей: 1475 | Зарегистр. 01-11-2004 | Отправлено: 17:32 05-01-2019
    persicum

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    add eax...
    adc eax,0
     
     
    Все будет работать, только у нуля будет два представления - 0 и FFFFFFFF. Пока ведутся долгие расчеты по этому modulo, на это можно начхать. Но по завершению всей процедуры если выпадет FFFFFFFF, то его можно добить до нуля.
     

    Цитата:
    а нужно (0хFFFFFFFF + 0) % 0хFFFFFFFE = 1

    ты опять все напутал, там % 0xFFFFFFFF

    Всего записей: 313 | Зарегистр. 27-06-2007 | Отправлено: 17:58 05-01-2019 | Исправлено: persicum, 19:14 05-01-2019
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Алгоритмы


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru