• Как сделать побитовое умножение и сложение большого числа 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 точки касания. Т.е. можно перебрать три стороны/вершины фигуры и строить круг, касающейся этих трех объектов. Это все еще сложная геометрическая задача на математику, но уже хотя бы подход появился.
    Написано
  • Что делать, когда Wolfram говорит, что будет корень, а считать не хочет - a³+b³=z³?

    wataru
    @wataru Куратор тега Математика
    Корень, Нет, эта точность тут - это общее количество значащих разрядов. Плюс там десятичная точка хранится в виде степени. Поэтому тип называется Decimal - числа с плавающей десятичной запятой. Ну, поставьте 2000 для начала. Оно должно быть хотя бы в 3 раза длинее каждого числа.

    Но вообще тут проблема с тем, что извлечение корня в этих числах - не точная операция. Вообще, 1/3 в Decimal не записать - это же бесконечная дробь. Но если смотресть по кубам, то все сходится. Даже для 400 знаков.

    Можно и корень извлекать, только надо аккуратно получить очень точное значение 1/3. Если просто передавать в Decimal 1/3, то там сначала во float вычисления будут.
    from decimal import *
    import math
    getcontext().prec = 400
    a = Decimal('2908337335267882719112393218356660694028796020413339889344001');
    b = Decimal('199577786472534580238277135938482051708016612125502091367466650497922405808640000')
    c = Decimal('199577786472534580238277135938482051708016612125502091367466856365842937955328680')
    print(pow(pow(a,3) + pow(b,3) - 1, Decimal(1)/Decimal(3)) - c)
    print(pow(a,3)+pow(b,3)-pow(c,3))


    Этот код напишет что-то очень близкое к 0 и 1. Чем больше точность вы будете задавать, тем ближе к 0 вы число получите. К сожалению, вычисление кубического корня через Pow никогда не будет идеально точно.

    Можно руками корень вычислять каким-нибудь методом ньютона, если вы подозреваете, что результат будет целым. Или результат округляйте и проверяйте, а не совпадает ли его куб с изначальным числом.
    Написано
  • Что делать, когда Wolfram говорит, что будет корень, а считать не хочет - a³+b³=z³?

    wataru
    @wataru Куратор тега Математика
    Корень, Количество знаков увеличте. Возможно, точности не хватает. В программе это число 400.
    Написано
  • Что делать, когда Wolfram говорит, что будет корень, а считать не хочет - a³+b³=z³?

    wataru
    @wataru Куратор тега Математика
    Корень, Потому что точность теряется. Ну и в процессе вычислений появляется трансцендентные числа, как и сказал mayton2019.
    Написано
  • Что делать, когда Wolfram говорит, что будет корень, а считать не хочет - a³+b³=z³?

    wataru
    @wataru Куратор тега Математика
    > То что ты посчитал - это трансцедедное число.

    Ну вообще, конечный результат - кубический корень из целого. Вполне себе алгебраическое число. Просто автор не умеет в powи реализует его через костыль вида exp(k*log(x))
    Написано
  • Как хешировать в хеш таблице узлы дерева?

    wataru
    @wataru Куратор тега Алгоритмы
    Даниил, Можно задачу формализировать? Что дано, что надо делать? Пример данных дайте, хотя бы.

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

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

    wataru
    @wataru
    BlinCT, Первый параметр у точек напутан. Смотрите: У второй и пятой точки, которые рядом с острием, этот параметр должен быть почти такой же, как и у острия. У третьей и четвертой точки этот параметр должен быть сильно меньше. У вас же там все наоборот.
    Написано
  • В чем причина данной ошибки?

    wataru
    @wataru Куратор тега C++
    aselockd, 3 гигабайта кода?!
    Написано
  • Как найти точки для обьекта и нарисовать его?

    wataru
    @wataru
    calculatePoint(mainCircleDiameter / 2, m_AngleNeedle); // вызов функции та что ниже
    QPointF Needle::calculatePoint(const double& radius, const double& angle, const double& offset)
    {
        QPointF pointF;
        pointF.setX(m_MainCircleDiameter.value() / 2 + radius * qCos((M_PI * angle) / 180.0) - offset*qSin((M_PI * angle) / 180.0));
        pointF.setY(m_MainCircleDiameter.value() / 2 + radius * qSin((M_PI * angle) / 180.0) + offset*qCos((M_PI * angle) / 180.0));
        return pointF;
    }


    В функцию передаете всегда один и тот же угол. Для для двух точек в основании - меньший радиус и offset +- половина ширины стрелки. Для двух точек у пика - больший радиус и такие же offset. Для точки на вершине - еще больший радиус и offset=0.

    Эти 5 полученных точек надо нарисовать, как полигон. Это уже не отрезок. Вообще, можно было бы и отрезком по двум концам рисовать с большой шириной мазка, но так труегольник на конце стрелки не сделать.
    Написано
  • В чем причина данной ошибки?

    wataru
    @wataru Куратор тега C++
    aselockd, Нужно больше кода. Выложите, что ли все файлы куда-нибудь.
    Написано
  • Как убрать утечку при работе с исключениями в macos?

    wataru
    @wataru Куратор тега C++
    netromniks, Похоже это ложное срабатывание детектора утечек. Возможно компилятор что-то соптимизировал и не стал что-то отчищать - все равно программа вот вот завершится.

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

    wataru
    @wataru Куратор тега C++
    Утечка чего? Памяти? Какой?
    Написано