• Как быть когда сущность из одного модуля требуется в другом модуле?

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

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

    Надо отдельно обработать случай y == y1
    Ответ написан
    Комментировать
  • Как сделать факториал деление?

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

    Вычислили 1/2. Это просто. Потом 1/(1+1/2). Это тоже просто, ведь 1/2 у вас уже есть. Потом вычислите 1/(2+(1/(1+1/2)). Последняя часть уже вычислена. Если ее обозначить за X, то вам надо подсчтитать 1/(2+X).

    Фактически у вас будет цикл на n итераций, и внутри вы будете пересчитывать этот самый X по формуле вроде X = 1/(n-i + X). Аккуратно посмотрите, может надо там +-1 куда-то вставить рядом с i.
    Ответ написан
    3 комментария
  • Как в php сравнить два огромных txt файла до 100гб, удалив дубликаты?

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

    Сортировка очень больших файлов - тоже стандартная тема. Лучше всего, наверно, подойдет radix sort. Правда, нужно будет свободного места на диске чтобы копии файлов тоже помещались, да лучше с запасом. Тут надо будет 3 раза (или какая там у вас длина строки) прочитать файл. Прочитанные строки надо распихивать по 256 (или сколько там символов различных может быть) файлам. Потом все эти файлы надо собрать воедино в нужном порядке.

    Надо только хорошо порыться в документации - нужны функции php которые читают файл построчно и не грузят его весь целиком в память. Если, конечно, у вас не ~128гб оперативки. Тогда лучше каждый файл загрузить в память целиком и сортировать quick sort'ом.
    Ответ написан
    Комментировать
  • В чём отличие хэш-таблицы от словаря и ассоциативного массива в C#?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Словарь и ассоциативный массив - это синонимы. Хеш-таблица - это вариант реализации словарей.
    Ответ написан
    2 комментария
  • Существует такое понятие, как "Ассоциативный список"?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Я бы это назвал списком режимов. Ассоциативный список - это что-то самопротиворечивое. У вас же просто список пар значений.
    Ответ написан
    Комментировать
  • Почему VS22 указывает что функция якобы не определена?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Кем подчеркивается? Оно компилируется нормально: https://godbolt.org/z/oMc89TE13

    Возможно ваше IDE не умеет в последние стандарты С++.
    Ответ написан
    6 комментариев
  • Как записать условие?

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

    есть_столбец_с_нулями = ложь
    Для каждого столбца j
      количество_нулей = ПодсчитатьКоличествоНулейВСтолбце(j)
      если количество_нулей >= 2 то
        есть_столбец_с_нулями = истина
    
    Если есть_столбец_с_нулями
      НайтиСуммуЭлементовНадДиаганалью();


    Функция для подсчета нулей в столбце простая - пройдитесь циклом по всем элементам столбца (по строкам). Если текущий элемент ноль - то увеличивайте счетчик.

    Можно не писать отдельную функцию а просто воткнуть вложенный цикл.
    Ответ написан
    1 комментарий
  • Как циклом Python for пройти несколько (сотен) range?

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

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

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

    3) Это трюк, чтобы все эти простые числа найти до логарифма найти.

    4) Кажется не обязательно и натуральный логарифм тут используется, чтобы оценка сложности была оптимальная. Но я не уверен. Лучше не надо.
    Ответ написан
    Комментировать
  • Почему функция y=x^x начинает возрастать, начиная с аргумента 1/e?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    В смысле почему? Почему y=x^2 имеет минимум в 0, почему синус имеет период в 2 пи? Ну вот просто такое свойство у данной функции. Так получилось. Это свойство можно вывести, например, посчитав производную заданной функции.

    Хочется какую-то интуицию? При маленьких x вы маленькое число возводите в маленькую степень при увеличении x вы увеличиваете и основание и степень. Увеличивая основание, вы увеличиваете результат. Ведь если большее число возвести в ту же степень, то результат увеличится. С другой стороны, основание-то меньше 1. Если увеличивать степень, то вы больше домножаете на маленькое число и результат должен уменьшатся. Для каких-то чисел основание перевешивает степень и результат при изменении x увеличивается. Для каких-то - наоборот.
    Ответ написан
    Комментировать
  • Как построчно выводить даные из .txt документа в C++?

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

    Откуда вы вообще взяли, что он должен читать весь файл? У вас цикл на одну итерацию. Внутри if/else, но в каждой ветке есть break, который цикл завершит. И в довесок ко всему - там еще и return стоит после break, который ни разу не выполнится.

    Вообще все надо с 0 переписать.
    Ответ написан
    Комментировать
  • Почему scanf считывает значение только первой переменной?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если вам нужен ввод целых чисел, то читайте их в целые переменные через %d. Еще, scanf возвращает количество прочитанных значений. Т.е. сравнивать надо с тройкой, а не единицей.

    Еще одна проблема: возможно, из-за настроек локализации, оно ждет десятичные запятые, а не точки. Попробуйте ввести "1,0 2,0 3,0" или "1 2 3".

    И вообще весь ваш сценарий - это комбинация ошибок в пером и втором абзаце. Из за точек вместо запятых оно читает только первую переменную сначала, видит, что ввело 1 переменную и завершает цикл. При вооде "1 2 3" оно читает все переменные, но из-за ошибки в проверке (вы же хотите, чтобы одна прочиталась) читает опять. При повтороном вводе "1.0 2.0 3.0" оно читает только первую переменную и завершается. При этом в b и c остались значения от прошлого ввода.
    Ответ написан
    2 комментария
  • Как составить диаграмму Эйлера и решить ее?

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

    Составьте уравнения. 4 куска в каддом круге суммируются к количеству преподавателей этого языка. 2 куска в каждой дольке из 2 кругов в сумме дают заданное число. Скмма всех 7 кусков - сколько всего преподов. 7 уравнений, 7 неизвестных. Решайте. Можно уравнения складывать и вычитать.
    Ответ написан
    8 комментариев
  • ОШИБКА: "cannot overload functions distinguished by return type alone" Что делать?

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

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

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

    Например, после какой-то высоты всегда снег. Ниже какой-то высоты всегда камень. А по середине нужно что-то случайное. Можно, например, генерировать 2 шума и сравнивать их как-то. Например, квадрат одного больше другого, умноженного на какую-то константу. С формулами надо поэкперементировать, посмотреть, что хорошо выглядит.
    Ответ написан
    1 комментарий
  • Как часто оператор goto используется в C?

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

    Вот текущий ваш код отлично реализуется и циклом while(true) c break, если числа правильные.
    И если тут все еще более менее просто с goto, то если вы и дальше будете его использовать, то у вас рано или поздно в функции будет несколько меток и разветвленная структура переходов между ними - вы уже сами на следующий день будете рвать волосы на голове в попытках понять, что там происходит.
    Ответ написан
    Комментировать
  • Как разделить mesh на отдельные сегменты?

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

    Чтобы не копировать кучу раз данные туда-сюда создайте один массив из треугольников. Потом заведите еще один массив int-ов для пометок, к какому мешу каждый из треугольников принадлежит. Вы его заполните и потом можно за один проход разложить треугольники по новым мешам.

    Еще заведите массив списков длинной сколько у вас точек. Пройдитесь по каждому треугольнику и засуньте его номер в 3 списка для каждой из его вершин.

    Ну, а дальше, Breadth-First-Search запускаете. Пройдитесь циклом по всем треугольникам, если он еще не помечен, запускаете BFS от него. Помечайте его новым номером, помещайте его номер в очередь, и циклом пока очередь не пуста, извлекаете из нее элемент. Смотрите 3 списка для трех вершин. Если треугольник оттуда еще не помечен, помечаете его текущим номером меша, кладете в очередь.

    Еще для ускорения можно после просмотра списка треугольников для вершины отчищать его.

    Альтернативный вариант - завести hash_map из пары вершин в номер треугольника. Пройдитесь по треугольникам, и для каждого ребра, если оно еще не помечено, кладите номер треугольника в map. Иначе текущий и второй треугольник связаны - добавьте каждый из них в список инцидентности для второго. В таком варианте у каждого труегольника будет три ребра в соседей по сторонам.

    Только перед обращением к мапе точки сортируйте.
    Ответ написан
    6 комментариев
  • Как нарисовать кривую Лагранжа через полином?

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