• Как сделать эффективный алгоритм перебора всех возможных значений?

    wataru
    @wataru Куратор тега Алгоритмы
    Негр Виталя, И еще, почему "То есть в диапазон должно входить 3^2=9 значений", когда их там 12 (три однобуквенных и 9 двухбуквенных). Тоже опечатка?

    Диапазон может быть любой? Вроде от "ab" до "ccabc"? Или, например, он включает все строки длины от 1 до N?
    Написано
  • Почему адреса переменных в памяти стоят в обратном порядке от объявления?

    wataru
    @wataru Куратор тега C++
    bLercs, Так получилось. Вы другой версией компилятора и/или с другими опциями оптимизации запустите - можете получить другой результат.

    Вообще, константы кладуться в отдельную секцию в исполняемом файле (.rodata, но это не точно) и вся эта секция загружается в память. Переменные же не лежат в экзешнике в основном, и выделяются при загрузке в исполняемого файла. Это довольно разные сценарии, поэтому ничего удивтельного, что там переменные по разному расположены.
    Написано
  • Какой есть алгоритм для оптимальной перегруппировки множеств (массивов)?

    wataru
    @wataru Куратор тега Алгоритмы
    nikitakls, И нельзя новые пары включать? А то, минимальное решение из одной группы можно сделать [17, 18, 47,48... (все числа)] => [A1,...,A12].

    Вообще, если не удается четко сформулировать задачу, давайте исходную задачу. Что это за числа, что за группы? Какой у них смысл? Может вам вообще не то нужно, что вы спрашиваете. А так это что-то среднее между задачей о покрытии множеств и задачей упаковки.
    Написано
  • Какой есть алгоритм для оптимальной перегруппировки множеств (массивов)?

    wataru
    @wataru Куратор тега Алгоритмы
    Если я правильно понял, и задача состоит в том, чтобы разбить битовую матрицу на наименьшее количество единичных подматриц (вычеркивая строки и столбцы), то ваше решение не будет оптимальным.
    Написано
  • Какой есть алгоритм для оптимальной перегруппировки множеств (массивов)?

    wataru
    @wataru Куратор тега Алгоритмы
    Ничего непонятно. Что значит перегрупировать? Как примерный вывод соответствует вводу? Любая пара число-АN, встречающаяся во входе должна быть в выводе, и строк должно быть минимальное количество?
    Написано
  • Как по массиву точкек нарисовать круг WPF? Из миллиона точек?

    wataru
    @wataru
    Вы хотите перерисовывать только часть линий. Но какую часть? Откуда вы знаете, какую часть можно перерисовать, а какая не поменялась?

    Обычно всякие ondraw/onrender вызываются системой, когда надо перерисовать окно почему-то. Например его свернули/развернули, или часть была перекрыта другим окном или указателем мышки.

    Обычно, система не хранит картинку для каждого окна и не компонует их на экране сама - это накладно. Вместо этого система говорит каждому окну: "рисуй вот тут на экране". В одной общей картинке.
    Написано
  • Как получить все возможные комбинации?

    wataru
    @wataru Куратор тега Алгоритмы
    HrustHr, list() надо вызывать, если вы хотите все распечатать. Чтобы пройтись по всем комбинациям циклом, он не нужен.
    Написано
  • Как получить все возможные комбинации?

    wataru
    @wataru Куратор тега Алгоритмы
    HrustHr, потому что вы сравниваете список всех замен со строкой. Сделайте
    for x in GenerateAll(.....):
      if x == "....":


    Все найдется.
    Написано
  • Как получить все возможные комбинации?

    wataru
    @wataru Куратор тега Алгоритмы
    HrustHr, Дополнил ответ.
    Написано
  • Почему ближайшие точки определяются неправильно?

    wataru
    @wataru Куратор тега Математика
    Quark, Вообще, чат-жпт можно только философам пользоваться. Иногда филологам, чтобы написать сочинение на тему, где все ответы правильные. Во всех остальных областях получите красивый, но бесполезный ответ.
    Написано
  • Почему ближайшие точки определяются неправильно?

    wataru
    @wataru Куратор тега Математика
    Quark, ЧатЖПТ вам сгенерировал бред. Никогда не спрашивайте у чатжпт что-то по теме, в которой вы не эксперт. Он примерно в половине очевидных вопросов и почти во всех неочевидных генерирует случайные, но правдоподобно выглядящие галюцинации. Формулы вообще не правильные.
    Написано
  • Почему ближайшие точки определяются неправильно?

    wataru
    @wataru Куратор тега Математика
    Формулы-то откуда взялись?
    Написано
  • Как сделать побитовое умножение и сложение большого числа decimal?

    wataru
    @wataru Куратор тега Алгоритмы
    pinkhead_psd,
    одержат младшие, средние и старшие 32 бита 96-разрядного целого числа


    Это как раз позиционная же система счисления. Только основание тут 2^32=4294967296. Надо работать с Long long.
    Написано
  • Как сделать побитовое умножение и сложение большого числа decimal?

    wataru
    @wataru Куратор тега Алгоритмы
    pinkhead_psd,
    Немного не понял почему у вас число 2 147 483 648 - {0, 1, 0, 0}, а не 2 147 483 648 - {2 147 483 647, 1, 0, 0}


    Потому что так работают позиционные системы счисления. Первое число - это сколько единиц. Второе число - сколько 2 147 483 648 раз помещается. Следующее число - сколько раз помещается 2147483648^2. Как число 123 - это 1*100+2*10+3, так и тут 1*2 147 483 648+0 = 2 147 483 648.

    Если вы будете просто разбивать число на сумму чисел не превосходящих 2 147 483 647, то вы максимум сможете записать число порядка 6 миллиардов. А в задании число из почти 30 знаков. Как раз 3 раза по 10 знаков в базе. Т.е. где-то до куба.

    В коде, что вы привели проблема в переполнении: надо Long long использовать для carry и там где у вас умножение надо приводить к Long long:
    carry += c.bits[i + j] + (long long)a.bits[i] * b.bits[j];
    Написано
  • Как сделать побитовое умножение и сложение большого числа decimal?

    wataru
    @wataru Куратор тега Алгоритмы
    pinkhead_psd, отрватительная структура предложена в задании. По уму экспонента должна быть отдельным полем. Но тут не сказано, в каком порядке числа записываются.

    > По сути я могу заполнить первый int bits[0] максимум 2 147 483 647

    Ну значит у вас база 2 147 483 648. Число 123 ,будет записано, как {123,0,0,0}. Число 2 147 483 648 - {0, 1, 0, 0}, 2 147 483 650 - {2, 1, 0, 0}.

    Код из ответа тут как раз почти сработает. Только длины поменяйте на 3. И массив c длины 7 заведите. При перемножении {100000, 0,0,0} и {100000, 0,0,0} (по идее это десятичное число 10000000000) будет {1410065408, 2, 0, 0}.

    Только тип у carry поменяйте на long long и аккуратно смотрите, чтобы у вас умножение в Long long происходило.
    Написано
  • Как сделать побитовое умножение и сложение большого числа decimal?

    wataru
    @wataru Куратор тега Алгоритмы
    pinkhead_psd,
    {{98656,8,0,0}}, так как 4444 * 222 = 986 568


    Ах ну и, да, числа обычно хранят развернутыми! Иначе вам надо все циклы развернуть. Так что код сверху насчитает {568, 986}. И еще, все ячейки должны хранить одинаковое количество цифр. Иначе, как понять, что {22,2} это 222 а не 2202? Вообще вы в произвольных местах числа на куски пилите. Нельзя так. Надо их записывать в определенной системе счисления. Например с основанием 1000 (по 3 знака в каждом разряде). Или 1000000000 - по 9 знаков. Но тогда аккуратно с переполнениями, ибо 2 таких цифры перемножить в int уже не помещается.
    Написано
  • Как сделать побитовое умножение и сложение большого числа decimal?

    wataru
    @wataru Куратор тега Алгоритмы
    pinkhead_psd, len1 и len2 - это длины ваших чисел. В общем случае. Если у вас всегда только по 3 цифры, ну замените там циклы до 3. Если вы хотите только самые значащие цифры сохранить, то вам надо в промежуточном массиве длинной до 7 сначала все подсчитать, а потом взять 3 самых значащих знака. Возможно округлив и прибавив +1 к последнему, если надо (отдельно смотрите случай, что у вас 999,999,999,999 Будет округляться до 1,000,000,000,000 т.е. три значащих занака по 999, но после округления у вас на самом деле есть перенос, увеличение экспоненты и всего один значащий знак.

    Как-то пытаться сразу подсчитать 3 самых значащих знака будет сложно - ибо там переносы из нижних разрядов можгут прийти.
    Написано
  • Не могу решать задачи по программированию?

    wataru
    @wataru
    Игнат Соколов, Нормально. если интересно - занимайтесь. Получите ранний старт по сравнению со сверстниками, к пенсии больше денег заработаете. Я сам где-то в 15 начал всеръез этим заниматься.
    Написано
  • Не могу решать задачи по программированию?

    wataru
    @wataru
    Декомпозировать - это разбивать задачу на части. Я начал решать задачи давно - именно так. Сначала ходил на какие-то олимпиады в школе. Решал какие-то задачи. Решал плохо. Потом устроился в клуб при местом университете, решал задачи там по выходным. Тогда не было такого обилия сайтов и решений в интернете, так что у вас больше возможностей.

    Книги: Кормен "Алгоритмы построение и анализ". Цикл книг Кнут "Искусство программирования". "Грокаем алгоритмы" Бхаргава.
    Написано
  • Не могу решать задачи по программированию?

    wataru
    @wataru
    Игнат Соколов, https://codeforces.com/problemset вот там задачи. Если не можете решать на литкоде, тыкайте в solutions над условием, там будет куча решений от всякого народу. Вполть до видео лекций. Читайте, смотрите, пытайтесь понять. Важно не копировать бездумно код оттуда, а попробуйте по образу и подобию сами написать.

    Специальный сопособ решать задачи, наверно, такой: Формализовать задачу. Что дано, какие допущения, какие ограничения. Потом попытки натянуть на это какую-то известную вам модель. Например, граф, или список, или массив. Потом попытка декомпозировать задачу. Потом перебор в голове всех известных вам алгоритмов и похожих задач, которые ассоциируются с тем, что вы видите в задаче. Не так и много различных приемов используется в итоге. На литкоде они прям тегами по темам промаркерованы. Будь то бин-поиск или сортировки.

    Еще частый прием: я его называю "рассмотрим ответ". Когда в задаче надо найти какой-то оптимальный объект, вы вместо того, чтобы думать, как можно его сразу построить, представьте себе его. Какими свойстваим он обладает? Может, его всегда можно чуть-чуть поменять при этом не ухудшая. Тогда ответ можно сразу искать среди тех, где вот это изменение выше не применить. Например, в задаче надо вписать круг максимального диаметра в фигуру. Рассмотрим ответ - максимальный круг. Если он не касается уже тремя тремя точками, его можно даже чуть увеличить или сдвинуть, чтобы он касался в трех точках. Вот вы уже знаете, что можно перебирать не вообще все круги, а только те, у которых 3 точки касания. Т.е. можно перебрать три стороны/вершины фигуры и строить круг, касающейся этих трех объектов. Это все еще сложная геометрическая задача на математику, но уже хотя бы подход появился.
    Написано