Задать вопрос
  • Как в c++ побитово просчитать int?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Что бы взять i-ый бит справа, надо сдвинуть число на i позиций вправо и наложить маску с одной еденицей в конце через побитовое И:
    (x >> i) & 1

    Вам надо циклом пройтись по битам от старшего (7, если один байт) до младшего с номером 0 и брать конструкцию выше.
    Ответ написан
    Комментировать
  • Как fill принимает массив умноженный на long long?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Арифметика указателей. Это получается указатель на за-последним элементом массива, как ::end() у коллекций.
    Ответ написан
    Комментировать
  • Верно ли я поставил знаки в формуле?

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

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно воспользоваться побитовыми операциями. Сложение по модулю 2 равносильно xor. Т.е. вам надо про xor-ить текст и гамму. Вычитание, что забавно, это тот же самый xor. Побитовый xor в си - это ^.
    Ответ написан
    3 комментария
  • Как среди элементов списка найти такой, чётность которого уникальна?

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

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

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

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Какой ужасный алгоритм! Лучше запихнуть первые два массива в hash-set (std::unordered_set). А потом при проходе по третьему массиву просто проверить, что этот элемент есть в первых двух set-ах.

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

    И код получится раз в 10 меньше и работать будет на пару порядков быстрее.
    Ответ написан
  • Как минимизировать логическое выражение?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Смотрите на похожие слагаемые, Из первых трех можно вынести AB. В скобках остается что-то похожее на последнее слагаемое. Примените обратного Де Моргана и то, что мы раньше уже обсуждали, чтобы получить AB. Потом, четвертое и пятое слагаемое можно вынести за скобки AC, остается (D+E). Это же (D+E) остается в 7 и 8 слагаемом, если вынести за скобки !B!C. 6 слагаемое комбинируется с последними двумя, если вынести за скобки !D!E.
    Ответ написан
    4 комментария
  • Как упростить логическое выражение?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    X+!X Y = X + Y

    Не помню, как эта теорема называется.
    Ответ написан
    5 комментариев
  • Как будет выглядеть данный псевдокод в коде на языке Си?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вижу несколько проблем. Во-первых, проставьте фигурные скобки ко всем циклам. И отступы поставьте аккуратно (открывающая скобка - +отступ, закрывающяя - -отступ). У вас сейчас инструкции, которые вы думаете в цикле - они вне его.

    Во-вторых, вот это что такое вообще? return flag=1;
    Ответ написан
    3 комментария
  • Как найти точки пересечения 2х фигур с++?

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

    upd: На этом же сайте есть все что нужно для проверки пересечения окружности и отрезков.
    Ответ написан
    2 комментария
  • Как в шифре с магическим квадратов заполнить пустые клетки произвольным символом?

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Напишите функцию, которая начиная с заданного индекса выделяет в строке число и возвращает индекс конца числа. Эта функция состоит из тупо одного while, который проверяет, а не символ или конце строки текущий символ.

    Сама программа идет по строке, если видит, что текущий символ - цифра, то запускает функцию выше. Потом выводит от текущего до найденного символа, потом сдвигает текущий индекс на конец числа. Лучше делать while. Внутри вы или увеличиваете индекс на 1, если текущий символ - не цифра, или сдвигаете его на конец найденного числа.
    Ответ написан
    Комментировать
  • Segmentation fault (core dumped) как пофиксить?

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

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Максимальный путь в графе с циклами найти тяжело. Обходом в ширину - вообще никак. Только полным перебором (что является скорее рекурсивным обходом в глубину, но с откатами).

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

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

    Правда, там трубуется, чтобы функция сторго возрастала а потом строго убывала.
    Если у вас функция горизонтальная на отрезках длины 1 (т.е. от целочисленных аргументов), то троичный поиск еще можно применить.

    Но если функция может принимать одинаковые значения на произвольном промежутке, то никаких логарифмических алгоритмов поиска максимума тут нет. Если обе промежуточные точки выдадут одно и то же значение, то никак не определить, в каком из трех промежутков лежит максимум.
    Ответ написан
    6 комментариев
  • Почему не проходит решение?

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

    Но ваша логика решения мне не понятна. Вам следует в каждой вершине поддерживать счётчик соседей листьев и их список. Далее, имейте очередь вершин с более чем k листьев рядом. Удаляйте k листьев. Если текущая стала листом (нужны счётчики для степени вершин), то добавьте её в список к единственному соседу.

    Чтобы не возиться с удалением соседей, помещайте вершины удаленными и при обходе списка соседей удаляйте их
    Ответ написан
  • Как минимизировать логическое уравнение?

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

    А дальше там будет 2 соседних слагаемых A !B !C !D+A C !D. Тут можно A !D вынести за скобки и останется (!B !C+C). Это можно сократить просто до !B + C. Было такое правило, вроде бы, но это можно доказать. Если C истинно, то исходное уже истинно. Если !B истинно, то либо !С истинно и истинно первое слагаемое, либо С истинно, и истинно второе слагаемое.

    Вот уже третье слагаемое сократилось то A !B !D

    Потом повторите фокус, вынеся за скобки из первого и второго слагаемого !B. Там останется !A+A !D = !A + !D
    Ответ написан
    3 комментария
  • Для чего нужен возврат значения по ссылке?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    b = func(a);

    Вот тут вы взяли ссылку, которую вернула func и скопировали значение в переменную b. Поэтому ниже &b выведет вам адрес переменной b, а не то, что вы хотели.

    Возвращать ссылки бывает удобно, когда надо вернуть значение без копирования и оно всегда существует. Потому что функция, возвращающая указатель, вообще говоря, может вернуть и nullptr. По уму, надо бы этот указатель проверить перед разыменованием. А вот ссылки - они всегда куда-то указывают.
    Ответ написан
    3 комментария