Задать вопрос
  • C++ Как посчитать сколько из данных чисел кратны числу n и заканчиваются на 1?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Число кратно n, если остаток от деления на n равен 0. Получить остаток можно, воспользовавшись оператором деления по модулю: x%n. Сравнение с 0 делается оператором сравнения ==.

    Число заканчивается на 1, если последняя цифра равна 1. Цифру можно получить, взяв остаток от деления на 10 (см. оператор % выше). Надо этот результат сравнить с 1.

    Чтобы выполнялись оба условия, надо объединить их оператором логического И (&&).

    Чтобы подсчитать числа, в которых выполняются условия выше - надо пройтись по ним циклом (или 5 раз написать похожий код). Там надо через if проверить условие и, если оно выполняется, увеличить счетчик (можно вот так: ++cnt;

    В код переводите сами, это же ваше задание по изучению C++.
    Ответ написан
    Комментировать
  • Как найти площадь квадрата, имея 2 отрезка?

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

    Не совсем пока еще понятно, квадрат может быть ориентирован как угодно, или тоже должен быть параллелен осям координат? Судя по тупости формулеровок я думаю, что составители задачи имели в виду более простой вариант, и стороны квадрата тоже должны быть параллельны.

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

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

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

    Похоже там тупо где-то стоит округление вниз, ведь разница после преобразований по всем каналам - ровно 1. Может, это значение RGB в HSL на самом деле что-то вроде (15.01, 30.5, 49.9). Но в пиксели HSL в итоге запишутся целые числа (0-255). Из-за этого округления при обратном преобразовании получается не 0x91 а 0x90.6, что, опять же, округляется вниз.

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Одно квадратное уравнение. Пусть точка конца имеет координаты t*v3. Уранение: |t*v3-v1|^2=100^2 (расстояние от начала до конца - 100). Распишите длину как сумму квадратов разностей по всем координатам. Там квадратное уравнение на t, ведь координаты v1 и v3 даны. Найдите положительный корень.
    Ответ написан
  • Почему последний множитель в формуле числа размещений = (n-k+1)?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Потому что оно есть n! / (n-k)! Вот n-k и в числителе и в знаменателе сокращается. А вот n-k+1 в числителе остается, потому что сокращатся ему не с чем.
    Ответ написан
    Комментировать
  • Как найти похожие отрезки в 2 множествах данных, или корреляцию с смещением?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Формализуйте метрику корелляции. Там если расписать - то в итоге все придет к свертке (если одну последовательность развернуть сначала). Ее можно за n log n подсчитать быстрым преобразованием фурье.
    Ответ написан
    Комментировать
  • Как в играх находят нужные участки памяти?

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

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

    Это реально 3 строки кода, если вам непонятно, снова почитайте учебник про циклы.
    Ответ написан
    Комментировать
  • Почему delete вызывает ошибку?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Первая ошибка:
    char *marka_ = new char;

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

    Вторая ошибка:
    char* m = "Renault"

    Тут используется значение аргумента по умолчанию, где у вас строковая константа. Тут не происходит копирование строки, просто в переменную m сохраняется адрес вот этой вот константы, которую компилятор куда-то в памяти проложения засунет. Вы не выделяли эту память, поэтому попытка сделать delete на ней - неопределенное поведение, что в данном удачном случае приводет к крэшу.

    У вас вообще проблема тут - marka может указывать на выделенную вами в Input() память, а может указывать на переданную из вне память. Кто ее удалять должен-то? Так же в Input() вы можете переписать переданный в конструкторе указатель. А надо ли было его удалять классу?

    Я бы сделал в конструкторе всегда копирование переданной строки. Тогда можно будет передавать туда и строковые константы и использовать вот такое вот значение по умолчанию.
    Ответ написан
    Комментировать
  • Как правильно оформить присваивание значения возвращаемого из функции C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потому что аргументы должны быть const Matrix&.

    Возвращаемое функцией значение является временным значением. В него нельзя писать, но его можно читать. Оно const. И его нельзя передавать в описанный вами оператор копирования.
    Ответ написан
  • C - как сделать замену подстроки в строке (руками)?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    А что делает startsof()?

    Даже если принять, что оно действительно ищет вхождение второй строки в первой - у вас там в каждой второй строчке ошибка.

    malloc(string_size + sub_size - to_size);

    Объясните мне, как вы получили вот это значение длины?

    А дальше копирование у вас неправильно. Чтобы заменить строку-вхождение вам надо в ответ скопировать начало str1 до вхождения, потом скопировать to, потом скопироваать конец строки str1, после вхождения. Это должны быть три параллельных цикла. У вас в одной ветке их 2 (один в функцию бесполезную спрятан), в другой - только 1.
    Ответ написан
    Комментировать
  • На сколько корректна такая реализация?

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

    А дальше надо поменять иерархию ваших классов.
    С такими циклическими зависимостями, конечно, можно что-то даже скомпилировать (в каждом cpp включать другой хедер, в интерфейсе второй класс передавать только как указатель. Или у вас в одном файле сначала сделать оба прототипа, forward declaration второго класса перед ними, потом реализации). Но это будет запутанно и сложно.

    Подумайте, а так ли вам надо в snakeUpdate передавать GameField? Можно, например, из Snake возвращать ее координаты или что там влияет на Update и потом их передавать какому-то методу в GameField. Сейчас ваш snakeUpdate вообще ничего из Snake не задействует - его можно наружу вывести, но это, наверно, еще в разработке. Не надо без крайней необходимости создавать усложненную структуру зависимостей классов. Решите, какой класс будет более важным, и пусть не ему передается второй класс, а второй класс наоборот дергает какие-то его методы.
    Ответ написан
    1 комментарий
  • Формула вращающегося прямоугольника как?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Ну это же школьная геометрия. (L-W)/sqrt(2), если длинная сторона L, а короткая W.

    Там равносторонний прямоугольный треугольник с длиной (L-W)/2 (вычли пересечение из длины, осталось 2 одинаковых куска, поделили пополам - нашли искомый кусок. А дальше - теорема Пифагора.
    Ответ написан
  • Как перевести строку в число в ассемблере?

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

    Надо уметь только делить с остатком и умножать на 10. Как перевести 1234 в строку? Можно взять последнюю цифру - осток от деления на 10. Вот вы получили цифру 4. В строке это будет символ "4", или байт со значением 0x34. Вообще, для получения символа по цифре - надо прибавить 0x30. Это мы взяли остаток, а вот результат деления - 123. Можно продолжить перевод так же и мы получим символы в обратном порядке.

    Итак, пока число не 0, делим нацело на 10. Остаток приписываем в ответ переводя в символ. В конце разворачиваем строку.

    Перевод же из строки в число делается проще - идем циклом по строке, умножаем переменную на 10 и прибавляем тукущую цифру.
    Ответ написан
    Комментировать
  • Статическая типизация на питоне, почему не работает?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Интерпретатор Python не осуществляет проверку типов:
    The Python runtime does not enforce function and variable type annotations. They can be used by third party tools such as type checkers, IDEs, linters, etc.


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

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

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

    Второй вариант - выходные дни недели подсчитать ручками: если дата начала и дата коца в одной неделе, то выходных нет. Иначе, если начало не понедельник - то сдвинуть ее до следующего понедельника и прибавить следующие субботу и воскресение к счетчику. Потом, если дата конца не пятница - сдвинуть ее на предудущий понедельник. Теперь разность между датами кратна 7 и покрывает сколько-то недель целиком. Делите разность на 7 и умножайте на 2, чтобы подсчитать, сколько там суббот и воскресений (разность может быть и 0 и это нормально).

    Потом надо ручками же подсчитать все праздники. Для этого составьте в массиве даты всех календарных праздников в затронутых годах отсортированные. Потом для каждой задачи в этом массиве бинпоиском найдите первый и последний праздник в отрезке. Вот вы уже знаете их количество (разность индексов +1). Так же можно еще вести список всех рабочих суббот и воскресений. Этот список дат можно, наверно, где-то из интернета автоматически скачивать, а можно и тупо ручками в январе вбивать в базу.
    Ответ написан
    Комментировать
  • Фабричный метод. Как создать рефлексивно по имени поля класс, наследуемый от абстрактного?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В С++ рефлексии нет. Только ручками. Где-то придется писать список всех классов и по всем им пробегаться и сравнивать строку. Ну или map какой-то создать. В качестве ключа вставлять команду, в качестве значения - функцию создающую объект конкретного класса.

    Как вариант, можно как-то упростить себе работу с помощью шаблонной магии. Шаблон будет принимать список всех классов, сравнивать первый с заданной командой и или рекурсивно вызваться дальше или создавать объект текущего класса.

    Пример можно посмотреть вот тут. Там CreateEncoderInternal делает практически то, что вам надо. Только там не константное поле command проверяется, а проверяется, что заданный формат есть в статическом списке в текущем классе.

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

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

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

    Еще одна причина - это кросс-платформенный код. Ну вот вызов какой-то функции winapi просто не скомпилируется под linux, потому что ее там тупо нет. Значит надо сказать компилятору вот тот кусок вообще игнорировать. Если это делается на том же этапе, что и сама компиляция, да и с тем же синтакисом, то возникает проблема - в синтаксисе-то ошибка под linux. Как-то разбираться, что эта ошибка не критичская и весь кусок кода можно тупо выкинуть - это компилятору сложно, да и опасно это. Поэтому нужен именно какой-то предварительный этап, который не может использовать тот же самый синтаксис.
    Ответ написан
    Комментировать
  • [OpenGL]Почему получается такая фигура?

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

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

    Если хотите вращать только фигуру, то сначала через glTranslate перенесите ее центр в ноль, потом вращайте и задавайте координаты вершин (относительно центра!).
    Ответ написан
    9 комментариев