Задать вопрос
  • Тип с точностью до 4 знаков C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Есть. Называется int. Вам надо хранить количество десятитысячных в числе. Иными словами, вы вместо x храните в int x*10000. При выводе делите на 10000 (и установите выводить 4 знака).

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

    Upd: И вообще, раз уж разговор о C++, то можно реализовать свой класс. Там можно даже отдельно хранить целую часть и 4 знака после запятой. Если вам встроенной точности int/int64_t не хватает. Все математические операции можно переопределить и работать, как со встроенным типом. Вообще, по-умному, это называется fixed point numbers.
    Ответ написан
    Комментировать
  • Как сделать поворот фигуры?

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

    Так, поворот против часовой стрелке вдоль оси Z, меняяет местами X, Y и делает меняет знак у X, т.е. X' = -Y, Y' = X, Z' = Z. Вам надо все тройки вот таким побразом поизменять. Поворот по часовой стрелки вдоль Z делает наоборот. Опять же меняет X и Y и меняет знак Y.

    Повороты вдоль других осей придумайте сами. Меняются местами две другие оси, и какая-то из них меняет знак. Представьте, куда двигаются (1,0,0), (0, 1, 0) и (0, 0, 1), что бы понять правила.

    При реализации только аккуратно делайте. Если помене на месте, то надо именно swap делать, ведь если выполнить x=-y; y=x, то у вас изначальная x координата затрется в первом выражении и потеряется навсегда.
    Ответ написан
    Комментировать
  • Как реализовать Алгоритм Решето Эратосфена от определенного числа, до данного?

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

    const int BE = 900000000;
    const int N = 1000000000;
    
    std::vector<int> small_primes;
    
    bool DivisibleBySmallPrimes(int x) {
    	for (int i = 0; i < (int)small_primes.size() && small_primes[i]*small_primes[i] <= x; ++i) {
    		if (x % small_primes[i] == 0) return true;
    	}
    	return false;
    }
    
    void ComputeSmallPrimes() {
    	int n = sqrt(N);
    	for (int i = 2; i <= n; ++i) {
    		if (!DivisibleBySmallPrimes(i)) {
    			small_primes.push_back(i);
    		}
    	}
    }
    
    void ComputeSieve() {
    	ComputeSmallPrimes()
    	std::vector<bool> sieve(N-BE+1);
    	std::vector<int> primes;
    	for (auto &x : small_primes) {
    		int i = (BE-1) - (BE-1) % x + x;
    		while (i <= N) {
    			sieve[i-BE] = true;
    			i += x;
    		}
    	}
    	for (int i = BE; i <= N; ++i) {
    		if(!sieve[i-BE]) {
    			primes.push_back(i);
    		}
    	}
    }


    upd:
    ComputeSmallPrimes можно переписать простым решетом - будет еще быстрее.
    Ответ написан
    Комментировать
  • Как написать на С++?

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

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

    Например, DirectShow или MediaFoundation.

    MediaFoundation поновее, побыстрее, поэффективнее и чуть поудобнее. Но криворукие разработчики драйверов его не всегда хорошо поддерживают. Всякие, особенно интегированные в лаптопах, камеры с ним глючат или не работают вообще. Плюс всякие виртуальные камеры, типа OBS не видны через MediaFoundation, потому что разработчикам влом по-нормальному реализовывать виртуальную камеру. Ну и оно только с windows 7 доступно.

    Если вы не планируете открывать камеру, а вам надо только информацию о ней собрать, или вы работаете с определенным устройством, то MediaFoundation вам подойдет лучше.

    Иначе смотрите DirectShow.

    Можно найти много примеров кода в интернете.
    Ответ написан
    2 комментария
  • Как изменить уравнения?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    s/i=delta/gamma

    Вторую часть не совсем понял, вы хотите подставить s из первого уравнения во второе и обособить i?

    Тогда Result1= (d/i+1)*gamma/delta

    Upd: ответ на отредактированный вопрос - никак. i всегда будет входить в выражение в степени -1.
    Ответ написан
  • В строке все элементы в десятичной системе счисления заменить в шестнадцатеричной системе?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Тут есть 5 подзадач:
    1) разбить строку на слова
    2) определить по слову, является ли оно числом в десятичной системе счисления
    3) Перевести слово в число
    4) перевести число из десятичной системы счисления в 16-ричную
    5) Записать число в 16-ричной системе в строку

    1,3,4 и 5 - стандартны и гуглятся.
    2 - подсказка: проверьте, что слово состоит только из символов '0'-'9' и не начинается с '0'. По идее, надо бы еще разрешить слово "0", но ноль, он и в 16-ричной системе будет ноль, поэтому такое слово можно не учитывать в вашей задаче. Символы 0..9 имеют коды ascii подряд, поэтому в программе достаточно записать с >= '0' && c <= '9'.
    Ответ написан
    Комментировать
  • Подсчет чисел в массиве, в языке C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Человек под номером i (c 0) идет в команду i % K, где K - количество команд (опять же, нумерация с 0).

    Вам надо лишь в цикле пройтись по всем числам и прибавить их в соответствующую ячейку ответа.
    Ответ написан
    Комментировать
  • Как перевести с python на c++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это копирование массива. На C++, если используете vector, то можно присвоение использовать. Там произойдет копия.
    Ответ написан
    Комментировать
  • Как можно вывести слово из текста s1, в котором встречается строка s2(Например, s1="qwe rtyu iopas", s2="ty", вывод "rtyu")?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Тут фактически 2 задачи:
    1) Разбить строку на слова. Тут вам поможет string::substr
    2) Проверить, что сторка s2 встречается в тексте. Вы уже умеете пользоваться string::find.
    Ответ написан
    Комментировать
  • Быстро ли мое решение?

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

    Ваш текущий вариант вносит дополнительное разименовывание указателя на каждое число.
    Вариант с memcpy внесет дополнительное копирование, что помедленнее разыменовывания указателя по идее.

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

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

    Вы же менянте местами значения int, значит временная переменная tmp должна быть int, а указатели надо разименовывать.
    Ответ написан
    Комментировать
  • Что подразумевается под функцией вектором?

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

    vector<int> cps = {};
    Заводит вектор cps, инициализирует его пустым. Можно = {} и не писать, вектор итак будет по умолчанию инициализировн пустым.

    cps.push_back(i);
    Вызывает метод push_back у cps.
    Этот метод добавляет в конец вектора переданное значение.

    Тут вам надо знать, что такое классы и их методы в C++.
    Ответ написан
  • Как посчитать количество разных букв в массиве строк?

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

    Второй вариант - отсортировать символы. Там уже проще подсчитать все символы - это 1 + сколько разных соседей в отсортированном массиве. Это быстрее, если использовать быструю сортировку.

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

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Гуглите opencv find matching image part.

    Если интересно, что там за алгоритм, то там используется свертка через быстрое преобразование фурье.

    Еще есть алгоритмы через перцептивные хеши.

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

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Если в метод передаются
    left = -1, right = phrases.Count
    , то их физический смысл: left - последний элемент точно левее искомой позиции (строка там или меньше pref, или начинается с него), а right - последний элемент точно правее искомой позиции (строка там больше pref и не начинается с него).

    Это не совсем стандартный инвариант. Обычно считают, что left, это такая позиция, что ответ не может быть левее ее, а right, что ответ не может быть правее.

    Но можно и с вашим инвариантом работать. Вам надо соответсвтующим образом менять left и right, чтобы инвариант поддерживался.

    Во-первых, если left == right -2, то вы уже знаете ответ - это может быть только left+1. Эти и должно быть условие в while. Правда стоит эту позицию после цикла все-таки проверить. Вдруг все строки в массиве меньше pref.

    Далее, подсчитали вы mid, если строка там оказалась меньше pref или c него начинается, то left = mid. Ведь уже следующая позиция может оказаться искомой, а физический смысл left, напоминаю - "точно левее искомой позиции". В противном случае надо делать right = mid+1. Ведь позиция mid вполне может и быть ответом.

    Вопрос, а не зациклится ли такой алгоритм? right-left >= 3. Значит mid оказывается строго больше left. Также, поскольку у вас округление вниз, то mid < right-1, а занчит в любом случае либо left либо right сдвинутся так, что длина отрезка уменьшится. Алгоритм не циклится.
    Ответ написан
    6 комментариев
  • Как посмотреть адрес в памяти у переменной с помощью отладчика (VS)?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В отладчике же можно целые выражения вводить. &x введите в watches.
    Ответ написан
    1 комментарий
  • PHP: как в односвязном списке удалить из середины элемент по его номеру?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Подсказка: вам надо найти не levelToCut-ый элемент, а элемент с номером levelToCut-1, ведь это у него надо перезаписать next на next->next
    Ответ написан
  • Как записать в переменную типа char строку неизвестной длины из файла?

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

    Можно, например, выделить массив с запасом - если вы знаете, что строк будет не более 100 размером не более 100 символов, то можно завести массив 100x100:
    char names[100][100].
    Читать туда можно хоть посимвольно, хоть через getline_s, хоть scanf (не забудьте только прописать в спецификаторе формата размер буфера, чтобы оно не переполнило массив).

    Второй вариант - это руками реализовывать фактически vector. Вам надо выделить память под массив какой-то длины, допустим 10. Если же вы уже прочитали 10 символов и надо что-то еще читать, то вам надо память перевыделить через realloc размера, скажем, в 2 раза больше.

    Также надо выделять и память под массив со строками char*. Если у вас 10 указателей, а файл еще не кончился и вы будете читать 11-ую строку, то перевыделите память на больше указателей.

    Ну лучше всего, конечно, использовать std::string и std::vector.
    Ответ написан
    Комментировать
  • Почему C++ код работает неправильно?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Много ошибок:
    1) number[i - 3] == 8; number[i - 2] == 8;, вопреки вашим ожиданиям, не присвоит значения в массиве значению 8. Тут выполняются 2 сравнения с 8, результат которых игнорируется.

    2) Неинициализированные переменные. В частности, k, из-за чего происходит выход за границы массива.
    Плюс, если x изначально окажется 3 (а она тоже не инициализирована), то после первой же 8 вы как бы найдете вхождение и тоже будете выходить за границы массива.
    Ответ написан
    3 комментария