Профиль пользователя заблокирован сроком с 1 марта 2021 г. и навсегда по причине: систематические нарушения п. 3.2, 5.11, 5.12 правил Сервиса
  • Как из циклического сдвига вправо сделать циклический сдвиг влево?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Завести второй массив (нигде в требованиях это не запрещено), а потом b[i] = a[ (i+shift) % size ];
    Ответ написан
  • Как из циклического сдвига вправо сделать циклический сдвиг влево?

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

    Вариант чуть получше - вместо разворота, представить, что массив развернут. Тогда при любом обращении к элементу номер x надо обращаться к элементу n-1-x. Т.е. тупо в программе, где сдвиг делается(после ввода), каждый arr[x] заменить на arr[n-1-x] (примеры x у вас там - n-1, i+1, i, 0).

    Вариант еще лучше - включить голову и просто подумать. Сдвиг влево - это в сторону уменьшения индекса. arr[0] становится arr[1], arr[1] - arr[2], и так далее. arr[n-1] становится arr[0]. Т.е. надо в буфер запомнить arr[0], пройтись циклом по возрастанию i и присвоить каждому элементу следующее за ним (+1 к индексу) значение. Потом arr[n-1] заполнить из буфера. На самом деле получится то же, что и в предыдущем варианте, но без лишних вычислений индексов.

    Вариант совсем хороший - не городить shift сдвигов на одну позицию, а сдвигать сразу на shift позиций. Для этого в буфер надо засунуть первые shift элементов, потом пройтись циклом и записывать в i-ый значение из i+shift-ого. Потом последние shift позиций заполнить из буфера.

    Вариант со звездочкой - можно делать без буфера на shift элементов, и сдвигать на shift позиций прямо в массиве, но тут надо знать про перестановки и GCD.
    Ответ написан
    6 комментариев
  • Арифметические действия в восьмеричной системе счисления?

    https://en.cppreference.com/w/cpp/string/basic_str...
    Складываешь, как самые обычные числа
    А потом через itoa переводишь обратно в строку

    Всё равно в компьютере вся арифметика происходит в двоичной системе
    Ответ написан
    Комментировать
  • Арифметические действия в восьмеричной системе счисления?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А в чём проблема? Есть два варианта. Первый - работать с числами, тогда компьютеру всё равно, в какой системе вы вводите и выводите значения, он всё равно считает в двоичной системе. Второй - работать со строковым представлением чисел, тогда пишете свой класс и перегружаете для него арифметические операции.
    Ответ написан
    4 комментария
  • Как вычислить сумму первых N элементов ряда?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам уже дана формула n-го элемента.
    В формуле, похоже, опечатка. Должно быть -1 в начале (если подставить n=0).
    Но это не особо важно, все равно первые члены ряда считаются отдельно.

    Соответственно, можно считать текущий элемент через предыдущий, как вы пытались:
    a_k = a_(k-1)*(-x)*(2k+1)/(2k-1)/(2k-1)/(2k-2)

    Только она не работает для k=1. Поэтому 2 первых члена ряда надо прибавить руками, а остальное в цикле i=2..n-1

    Т.е. R вам не нужен, и в коде должно быть:
    u = 1+3*x;
    ...
      u *= (-x)*(2i+1)/(2i-1)/(2i-1)/(2i-2);
      summa += u;


    Да, еще стоит разобрать крайние случаи, если n =0, то надо отдельно вывести 1 (или -1, если мы исправляем опечатку).
    Ответ написан
    4 комментария
  • Сколько существует путей и почему?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Количество сочетаний из 125 по 50. Или 125!/50!/75!
    Потому что он обязательно сделает 50 шагов вправо и 75 шагов вверх. В любом порядке. Т.е. всего 125 шагов из которых любые 50 - по горизонтали.
    Ответ написан
    1 комментарий
  • Как получить всевозможные комбинации массива PHP?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Подсчитайте руками, сколько комбинаций для массива из 1,2,3,4 элементов? ответ будет 1,3,7,15 - степени двойки минус один. Подумайте, откуда это берется? Каждый элемент может или быть в ответе, или нет. 2 варианта. Премножаем все, получаем степень двойки. Но это учитывает варинат пустого ответа, поэтому один надо вычесть.

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

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

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

    Составьте уравнение. Вот есть у вас функция времени для n входных данных f(n) на компе B. На компе A время выполнения будет - f(n)/100, ведь он в 100 раз быстрее.

    Теперь обозначьте за x объем данных на компе A, который надо найти. Тогда у вас f(x)/100 = f(n). Подставьте нужную функцию вместо f() и найдите x. Спойлер, будет похоже, но не то, что у вас в вопросе указано.
    Ответ написан
    2 комментария
  • Когда использовать ООП?

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

    Мне нужен объект, который будет хранить состояние/данные, и есть общие операции над этим состоянием?


    Вопрос: что значит нужен? Всегда можно взять глобальную переменную, написать функции, которые это состояние принимают и что-то с ним делают. Но довольно часто организация в виде объекта просто удобнее.
    Ответ написан
    1 комментарий