• Проверить первые 2 байта?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Окройте файл в ifstream в бинарном режиме и читайте 2 байта через read.

    Или используйте fread. Читайте 2 байта в буфер длинной 2.
    Ответ написан
    Комментировать
  • Рекурсия.По какой причине ответ всегда 0?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Аккуратно расставьте отступы. У вас там логика if else напутана, и программа делает совсем не то, что бы вам хотелось. Кроме того, посмотрите внимательно на warning-и от компилятора (он точно скажет, что power иногда не возвращает никаких значений, хотя вам кажется, что return есть во всех ветках if else). Это как раз потому, что у вас скобки не так расставлены и else относится совсем не к тому if, как вы хотели бы.
    Ответ написан
    Комментировать
  • Зачем в стандартной библиотеке вначале класса объявлены псевдонимы для параметров шаблона?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это делается по нескольким причинам.

    Во-первых, чтобы можно было к параметру шаблона обращатся в других шаблонах. Вот, вы привели пример с _Сontainer в каком-то итераторе. Можно представить что есть какой-то алгоритм (функция), который принимает итератор и ему там надо будет как-то использовать тип контейнера (или временную переменную завести, или тип возвращаемого значения задать или как-то проверить, что тип контейнера обладает какими-то свойствами).

    При этом алгоритм должен получать и вот этот вот back_insert_iterator и еще десяток других итераторов. Поэтому нельзя тип контейнера вынести в параметр шаблона и указывать его в типе итератора в праметре функции. Вы поищите в исходниках этот самый "_Container" - станет понятно, как оно используется.

    Во-вторых, иногда это делается и для удобства. Ибо в этих шаблонах параметры сами могут быть адски нагроможденными шаблонами.
    Ответ написан
    Комментировать
  • Как сравнить 2 класса с разными шаблонными параметрами?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    А не проще ли так?
    template <const std::size_t other_columns>
     Matrix<rows, other_columns, T> MultiplyOnMatrix(const Matrix<columns, other_columns, T>& matrix)
    Ответ написан
    1 комментарий
  • Как ускорить код на Python?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Я предполагаю, что условие вашей задачи такое - дано куча запросов вида <начало отрезка, конец, значение>. Все ячейки в этом отрезке заполняются заданным значением, если они меньше его. Надо найти сумму всех ячеек в конце.

    Тут есть два решения. Первое - через дерево отрезков с отложенным изменением. Само дерево немного странное получается, потому что оно ничего не считает в промежуточных вершинах, а будет только хранить отложенное изменение. Физический смысл отложенного изменения - "все ячейки в этом поддереве должны быть не меньше этого значения". Релаксация (спуск вниз) отложенного изменения происходит так: отложенное изменение в детях заменяется на максимум из того, что там лежит и отложенного значения в родителе. Значение в родителе заменяется на 0. При запросе спускайтесь рекурсивно по дереву, релаксируя изменения, пока текущее поддерево не будет целиком лежать в запросе. Тогда перезаписывайте отложенное значение в текущей вершине, если оно меньше. В конце обработки запросов релаксируйте все вершины сверху вниз и просуммируйте значения в листьях.

    Второе решение - через метод сканирующей прямой может быть проще в реализации из-за наличия встроенных структур данных. Я думаю, в питоне должна быть структура, которая умеет быстро добавлять число, удалять число и брать максимум из всех чисел. В C++ есть std::set или std::priority_queue.
    Для каждого отрезка-запроса создайте два события вида <координата, отрезок открылся/закрылся, значение> (разберитесь, где там +-1 поставить так, чтобы длина отрезка по координатам равнялась количеству покрытых ячеек). Засуньте их все в один массив и отсортируйте по координате. Потом проходитесь слева-на-право. Применяйте текущее событие - или добавляйте число в вашу структуру данных, или удаляйте оттуда. Между текущим и следующим событием по координатам все ячейки покрыты одним и тем же множеством отрезков, поэтому можно их все быстро посчитать, ведь ваша структура умеет брать максимум. Добавляйте к ответу разность координат между текущим и следующим событиями, умноженную на значение максимума из структуры. Все.
    Ответ написан
    Комментировать
  • Тут же нужно найти матрицу перехода?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Не очень понятно задание, что там за матрицы даны, но в общем случае делается так: найдите матрицу перехода из старых координат в новые. Это будет S^(-1). Чтобы получить преобразование в новом базисе, надо взять координаты, перейти в старый базис, применить перобразование (А) и перейти назад в новый базис. Т.е. ответ - произведение трех матриц: S*A*S^(-1)
    Ответ написан
    Комментировать
  • Я инвалид, проблемы с руками. Возможно ли мне стать программистом? Какие шансы?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Возможно. Шансы как у всех. Умение быстро печатать - вообще не критично программистам.
    Большую часть времени вы будете читать и понимать уже написанный код, а также обдумывать структуру ваших программ. Скорость печати на производительность программиста влияет минимально.
    Ответ написан
    2 комментария
  • Как лучше организовать алгоритм подсчета выгоды?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Вам надо формализовать задачу. Аккуратно, с формулами, расписать все типы промокодов, как они действуют и взаимодействуют.

    Если бы все промокоды давали процентную скидку, то можно было бы брать жадно, но эти абсолютные коды все ломают. Тут можно посмотреть не решение задачи о рюкзаке или о размене монет (динамическое программирование), похоже это позволит ускорить решение. Вроде как - перебрали какие процентные коды вы применяете и вот остается у вас сумма X. Вам надо абсолютными кодами набрать максимальное число не больше X.

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Ну да, вам придется рассматривать отдельный случай - когда они идут подряд. Проверяйте, что а вдруг min->next == max. Нарисуйте картинку из четырех точек before_min, min, max, max->next со стрелочками до помены и после. Смотрите у каких трех вершин ссылки поменяются и как. Запишите это в коде.

    Еще есть случай max->next == min, но его можно рассмотреть вместе с предыдущим - просто в этом случае поменяйте месами указатели min и max (а также before_min и before_max). Тогда код для прошлого случая сработает. Вам же в момент помены без разницы, какая вершина максимум, а какая минимум. Вам надо только 2 заданные вершины поменять местами.
    Ответ написан
  • Как вычислить сумму бесконечного ряда, используя смешанный способ и общую формулу для вычисления члена ряда. Как найти рекуррентную формулу?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Понятия не имею, что за смешанный способ вам нужен, но сумму этого ряда можно найти два раза взяв производную.

    Пусть f(x) - ваш ряд. Тогда f'(x) = sum (-1)^n x^(2n-2) / (2n+1)

    Чтобы совсем избавиться от знаменателя надо бы, чтобы степень была 2n+1. Можно этого добиться, домножив все на x^3. Потом можно опять взять производную.

    (x^3 f'(x))' = sum (-1)^n x^2n = sum (-x^2)^n = 1/(1+x^2)

    Теперь назад проинтегрировав это можно получить:
    x^3 f'(x) = arctg(x)+C

    При x=0 слева 0 - значит C=0.

    f'(x) = arctg(x) / x^3

    Отсюда можно найти f'(x): Зайдите на wolframalpha и введите integrate arctg(x)/x^3 dx (не могу дать прямую ссылку с запросом на wolfram, потому что мат-фильтр почему-то срабатывает на ссылку и не дает отправить ответ).

    Чтобы найти константу, придется подставить, например, x=1 и найти сумму ряда a_n = (-1)^n/(4N^2-1). Это какой-то известный сходящийся рад, похоже. Опять, посмотрите на wolframalpha, введите там sum (-1)^n/(4*n^2-1), n=0 to infinity. В итоге получится, что там константа тоже 0.

    Вот и получится, что f(x) =- (x^2 * arctan(x) + arctan(x) + x) / (2x^2)
    Ответ написан
    Комментировать
  • Как найти неизвестные параметры функции, зная ее значения?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Поскльку у вас уже жестко задан вид функции, то это задача на минимизацию функции ошибки (от n и k). Обычно мнимизируют сумму квадратов ошибок по всем примерам.

    Аналитически, как в методе наименьших квадратов, приравнять производные по n и k к 0 похоже не очень получается. Придется использовать какой-то численный метод минимизации функции. Например, градиентный спуск или метод ньютона. Если похоже, что функция имеет множество локальных минимумов, то будет работать что-то более хитрое, как например, метод отжига.
    Ответ написан
    Комментировать
  • Как перегрузить оператор += для двух массивов?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас нет проблем с перегрузкой. У вас там проблема с логикой программы. Для начала объясните себе, что хранит в себе класс Array (зачем там 2 массива a и b?), что должен делать опреатор += для двух экземпляров Array?
    Ответ написан
    Комментировать
  • Как написать кастомный findIndex с бинарным поиском?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Есть два варианта. Первый - функция возвращает -1, 0 или 1 сравнивая 2 элемента в зависимости от того, какой меньше или если они равны.

    Второй вариант - функция должна возвращать 1, если первый элемент строго меньше второго.

    Тогда равнество можно сделать так: !f(a,b) && !f(b,a). А второе условие просто заменяется на один вызов функции.
    Ответ написан
    7 комментариев
  • Как разложить поворот вокруг произвольной оси на повороты вокруг ортов СК объекта?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    180-градусов вдоль оси вдоль зеленой детальки (вправо), а потом 90 градусов вдоль оси перендикулярной деталькам (ось к нам). Ну или в обратном порядке - сначала 90 градусов вдоль перпендикулярной оси, потом 180 вдоль продольной оси (вверх).
    Ответ написан
  • Как вставить определенное слово в строку в необходимом мне месте?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Не так почти в каждой строчке.

    Во-первых, зачем вам структура из четырех строк? Зачем вам массив из нее на 1000 элементов.

    Вот это вообще что за хрень?
    for (i; i < 1; i++) {

    Вас этот цикл из одной итерации нисколько не напрягает?

    Далее, в задании четко сказано
    Разработать функцию, которая вставляет в предложение заданное слово. Новое слово должно стать в предложении n-м (n задается как третий параметр функции)


    Т.е. вам надо взять одну функцию, и вызвать ее 3 раза с передавая туда то 1, то 2, то 5, а не писать 3 Poshuk'а.

    Далее, во всех ваших функциях вы обращаетесь к list[] по разным индексам, но у вас только один первый элемент массива вводится (опять, нахрена вам целый массив структур, если в задаче дано ровно 3 строки и одно слово?!)

    Ну и последнее, логика искомой функции должна быть такой: Проходимся по переданной строке, считатем, сколько пробелов встретили. Как только встречаем пробел с заданным номером, сдвигаем все символы за этим пробелом вправо на длину вставляемого слова, потом копируем слово в пустое место.

    Чтобы сдвигать символы в строке вам надо сначала найти ее длину, потом с длина+k циклом пройтись назад до крайнего сдвигаемого индекса и присваивать текущему символу значение символа по индексу i-k.
    Ответ написан
    Комментировать
  • Как завершить все потоки сразу после завершения одного из потоков в си, используя толлько pthread_detach и pthread_join?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если вызвать exit какой-нибудь, то программа завершится и система прибъет все потоки.
    Ответ написан
  • Почему можно обратиться к объекту через указатель со значением nullptr?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Метод класса под капотом - это функция, котрой помимо прописанных параметров передается указатель на объект. В вашем случае передается nullptr. Но сама функция не обращается к объекту, да у него и членов-то с данными никаких нет. Поэтому все более менее работает. Но это UB и могло и не повезти. Из-за оптимизаций компилятор мог бы что-то сломать.

    P.s. сказанное выше не относится к виртуальным функциям. Там указатель на функцию храниться в vtable в экземпляре класса и вызов через nullptr скорее всего упадет.
    Ответ написан
    Комментировать
  • Как сделать сортировку двухмерного массива по столбцам?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Работайте с массивом как с одномерным. Занумеруйте его так: первые индексы - это первый столбец сверху вниз. Потом идут индексы с ячейками второго столбца и т.д.

    Вам осталось по одному числу - индексу в этом виртуальном одномерном массиве получать индексы исходного двумерного массива.

    Номер столбца будет i / M, Где M - количество строк. Номер строки будет i % M.

    Вам надо только написать алгоритм сортировки одномерного массива и везде, где там идет обращение к [i], вам надо сделать [i % M][i / M].
    Ответ написан
  • Как использовать socket в gcc на windows?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если вы используете cygwin для компиляции, то можно и линуксовый socket использовать. Будет чуть менее эффективно из-за фактически эмуляции posix api.

    Ну или, если через visual studio компилируете, то используйте winsocket API
    Ответ написан
    Комментировать
  • Как решить задачу по математике с помощью python?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Это не задача на программирование, а задача на математику. Решение - одна формула.

    Сначала решите уравнение, при какой величине вклада X доход от бумаги и от банковского вклада будет одинаков?

    1.1X+2000 = 1.12X

    До этой суммы выгоднее брать бумагу - после - вклад.
    Далее надо 4 раза взять одно из двух, сравнивая текущую сумму с пороговым значением выше.

    От питона вам надо уметь выполнять действие 4 раза:
    for i in range(0, 4):

    Сравнивать 2 значения и делать в зависимости от этого разные действия.
    if a < b:
      foo
    else:
      bar


    Ну, вряд ли вы не знаете, еще надо уметь присваивать переменные и выполнять арифметику - умножение и сложение.
    Ответ написан
    Комментировать