• Как сделать проверку числа на повторность в массиве?

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

    Можно из цикла при совпадении выходить через break.

    Нечетные числа можно генерить сразу, умножая рандом на 2 и прибавляя 1.
    Ответ написан
  • Как вытащить значение из под указателя на начало строки?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Для преобразования из строки в число можно восспользоваться atoi().

    Однако, если в строке фиксированное заранее известное количество чисел, то лучше воспользуйтесь sscanf(). Можно указать нужное вам количество %d через запятую примерно так:
    sscanf(s, "%d, %d", &a, &b);
    Ответ написан
  • Как соединить в пары элементы двумерного массива?

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

    А дальше можно через np.asarray и map преобразовать массив touples в массив массивов.
    Ответ написан
  • Какой список использовать?

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам нужно сделать побитовое И с маской, где стоят 0 в нужных вам разрядах (и 1 в остальных). Маску можно задавать прямо бинарной или шестнадцатеричной константой.
    Ответ написан
    Комментировать
  • C++ Оператор и его перегрузка?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ну вот так прнято в С++. Оператор префиксного инкремента (++i) имеет такую сигнатуру - он возвращает ссылку на измененный объект. Если выхотите чтобы у вашего класса Date можно было сделать ++date, то надо переопределить вот такой вот оператор. Это позволяет писать более читаемый и короткий код. Вместо date.IncremeantAndReturn() можно использовать идиоматичное ++date, или даже что-то вроде while (++date < deadline). Это не обязательно делать, но иногда это весьма удобно и полезно.

    Оператор должен возвращать измененное значение, поэтому и возвращается *this после его увеличения;

    В этом коде Сopy не используется. Оно тут не нужно вообще. копия понадобится для постфиксного инкримента (i++), который должен возвращать неизмененный объект.

    Передача *this в конструктор Copy - это для вызова конструктора копирования, чтобы, внезапно, создать копию текущего объекта. Подумайте, как вам скопировать текущий объект? Надо новому объекту присвоить текущий, или в конструктор передать ему текущий объект. Но как передать текущий объект? У вас есть указатель на него this. Разыменовав этот указатель (*this) вы как раз можете передать текущий объект куда надо.
    Ответ написан
    Комментировать
  • Помощь с задачкой на Си?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Раз с русскими буквам не работает - это значит, что русские буквы идут в каком-нибудь utf-8 формате. Тогда один символ может задаваться несколькими байтами. Ваша работа с char проверяет, что слова являются полиндромами побайтово, что в случае utf-8 не то же самое, что посимвольно.

    Попробуйте или поменять кодировку файла на что-нибудь вроде CP1251.

    Или перепишите вашу программу используя wchar_t* и wcstok()
    Ответ написан
    3 комментария
  • Как найти все комбинации многоуровневого ассоциативного массива?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Рекурсивно. Функция должна получать уже набранный элемент и оставшиеся параметры. Она берет первый параметр и перебирает все его варианты, плюс пустой вариант (пропустить этот параметр). Добавляет это к элементу и рекурсивно запускается от оставшихся параметров с измененным элементом. Если параметров больеш нет - функция добавляет текущий ответ к результату. Правда этот алгоритм переберет еще и совсем пустой варинт []. Вам надо будет отдельно это проверить и не добавлять этот элемент в результат.
    Ответ написан
    1 комментарий
  • Как создать копию массива значений и массива указателей без std?

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

    Массив указателей от массива значений не отличается ничем. Просто там значения - это указатели. Аккуратно не допустите ошибки при использовании sizeof - если ему передать сам массив (указатель), то это будет размер указателя, а не всего массива. Надо брать размер одного элемента и домножать на их количество.

    Если изначальный объект можно удалить, то вам надо переопределить оператор перемещения, а не копирования. Внутри ваши массивы - это просто указатели и их можно перемещать как переменные:
    keys_ = node.keys_;
    node.keys_ = nullptr;


    Не забудьте изначальное место затереть нулевым указателем, чтобы нечайнно потом два раза не удалить.

    Так делать при копировании нельзя - ибо вы создаете несколько указателей на один и тот же массив и вообще непонятно, кто потом должен это удалять. Только при перемещении.

    Когда вы определили оператор перемещения (или конструктор перемещения), то далее оберните элемент источник в std::move() при присваивании или передаче в конструктор. Тогда вызовется действительно перемещающий метод.
    Ответ написан
    Комментировать
  • Не выводится отсортирований масив, лезет мусор из памяти, как исправить? run-time check failure #2 - stack around the variable 'c' was corrupted?

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

    Смотрите внимательно, к каким индексам вы обращаетесь и какое значение может принимать переменная j.

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

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

    Копируете в uint64_t. Если надо меньше бит, то можно домножить на большое простое число и потом взять xor младших и старших бит.
    Ответ написан
    4 комментария
  • Задачка по раскрою максимального количества коробок на листе?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Тут нет никакого готового алгоритма. Это геометрическая задача раскроя. Надо порисовать и придумать какой-то паттерн. Рассмотреть несколько случаев и выбрать наилучший в зависимости от ваших размеров.
    Ответ написан
    4 комментария
  • Как из массива рандомных натуральных чисел вычислить две равные суммы?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Это задача - вариант Subset sum problem.

    Она NP-полная - тут нет быстрых и простых решений. В общем случае, возможно только решение полным перебором за N*3^N. Что-то вроде того, что предложил Alexandroppolus, только там вообще не рассматривается случай, что текущее число просто пропускается. Еще можно делать это же без рекурсии на основе битовых масок.

    Если есть какие-то дополнительные условия (например, все числа очень маленькие), то может более быстрым быть решение на основе динамического программирования, как в задаче о рюкзаке.
    Ответ написан
    1 комментарий
  • Как построить граф по матрице?

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


    Это какой-то бред. Начало фразы подразумевает, что ребра есть между всеми парами вершин, продолжение говорит, что все ребра длины 1 между соседними клетками. Я предполагаю что тут именно второй вариант.

    Во-первых, занумеруйте все клетки. Подойдет простая формула вроде i+m*j

    Вот у вас уже есть n*m вершин в графе. Теперь добавьте ребра. Для каждой клетки (два цикла) посмотрите 4 соседние клетки. Если обе клетки - ., то добавьте из текущей клетки ребро в соседнюю.

    Соседей удобно перебирать, если завести константные массивы для смещений:
    const int dx[4]= {1, 0, -1, 0};
    const int dy[4]= {0, 1, 0, -1};


    Тогда для клетки (i, j) можно перебрать всех соседей одним циклом на 4 итерации - (i+dx[k], j+dy[k]). Надо только не забыть проверить на выход за границы матрицы.

    Ну и вам надо написать функцию типа AddEdge(int u, int v) которая будет в удобную для вас структуру данных добавлять ребра. Граф удобно хранить в виде списков смежности. На C++ это можно сделать просто std::vector<std::vector<int>> и добавлять соседей через vector::push_back. Это на практике работает быстрее всяких связных списков.

    И у вас будет три вложенных цикла - внешние по всем клеткам, а внутренний по четырем направлениям. Внутри вы проверяете, что сосед по этому направлению есть и между клетками можно пройти. В этом случае вызывайте AddEdge.

    А можно вообще граф не строить. Берете ваш алгоритм поиска кратчайшего пути (BFS, Dijkstra или A*) и там везде, где перебираются соседи одной вершины, вставляете код проверки четырех направлений через dx/dy. Вершины можно или нумеровать их координатами, и тогда все массивы пометок будут двумерными, или можно использовать формулу u = i+j*m, (i,j) = (u%m, u/m) для преобразования координат в номер вершины и назад.

    А еще есть всякие алгоритмы, которые работают сильно быстрее за счет использования того факта, что у вас не произвольный граф, а сетка в матрице. Jump Point Search - один из таких алгоритмов. В нем граф умышленно не строится и работа идет непосредственно в матрице.
    Ответ написан
    Комментировать
  • Почему у меня выводится непонятно что и как это испрвить?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Выводится ровно то, что вы попросили выводить - неинициализированный элемент массива c.
    Подумайте, чему равно a в конце программы?
    Ответ написан
    6 комментариев
  • Почему возникает ошибка "cannot open file"?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В винде екзешники нельзя менять, пока они запущенны. Когда вы запустили программу в отладчике, она все так же запущена, просто стоит на паузе.
    Ответ написан
    3 комментария
  • Почему меняется значение переменной после передачи значения в функцию (C++)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас в input_matrix выход за границы массива: в массиве n-1 элемент, а вы читаете n.

    Массив лежит на стеке, там же где локальная переменная n. Так получилось, что n лежит сразу за matrix (или в пределах восьми байт) и оказывается испорчена. Данные кажутся вам случайными, потому что читаете вы double и какая-то его часть попадает в область памяти int n.
    Ответ написан
  • Есть ли сервис для создания формулы для числа?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Зачем сервис? Вот вам формула для любого числа X = (X-1) + 1. Например, 172 = 171+1.

    Или вам какое-то особое свойство у формулы нужно?
    Ответ написан
  • Не работает код, ошибок нет. Что делать?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Смотрите внимательно - какие переменные вы выводите и как они меняются в коде. Нормальные названия кстати упростили бы вам поиск ошибки.
    Ответ написан
  • Почему дружественная функция, определённая внутри класса с первым параметром встроенного типа, недоступна вне определения класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы пытаетесь вызвать f1 и т.д., как будто это члены класса A. Но подумайте, какой смысл объявлять члены класса friend? Зачем вообще дружественность нужна? Чтобы иметь доступ к приватным членам класса, но ведь члены класса и так имеют туда доступ. Это бесмыссленная операция.

    Но так уж стандарт сделан, что вместо ошибки компиляции, определенные через friend функции становятся глобальными.

    По идее вы в классе должны их только объявлять (сигнатура без тела), а определение (тело функции) должно быть уже снаружи где-то, как вы с f1 сделали.

    Почему f5 не находится? Попробуйте передать туда, допустим a. Компилятор, внезапно, найдет функцию и ругнется, что не может преобразовать A к int. Но если передать туда int, то компилятор функцию потеряет.

    Тут хитрая магия описанная в стандарте - всякие нагромождения правил посика имен.
    В стандарте сказано, что вот при определении friend функций:
    A name first declared in a friend declaration within a class or class template X becomes a member of the innermost enclosing namespace of X, but is not visible for lookup (except argument-dependent lookup that considers X) unless a matching declaration at the namespace scope is provided - see namespaces for details.


    Я не знаю, как это внятно объяснить, вот просто не работает и все. Стандарт такой. С остальными функциями срабатывает, потому что там в аргументах есть A, поэтому объявления в классе каким-то образом попадают в область поиска имен.

    Просто не надо определять функции-друзей в классе. Это не имеет смысла. Или делайте там статичные функции, или определяйте всю функцию во внешнем пространстве имен а в классе указывайте, что она имеет доступ ко всему классу.
    Ответ написан
    1 комментарий