Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2022, 23:10   #1
room60
Пользователь
 
Регистрация: 22.09.2022
Сообщений: 24
По умолчанию Циклический сдвиг

Осуществить циклическое смещение компонентов вектора A(a1,a2,...,an) на l позиций влево таким образом, чтобы преобразованный вектор выглядел так:
A(al+1,al+2,...,an,a1,...,al) .
С++
room60 вне форума Ответить с цитированием
Старый 22.10.2022, 10:50   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,551
По умолчанию

Наверное, как-то так:
Код:
   for (i=1;i<l;i++)
      {  tmp = vect[0] ;
          for (j=0;j<n-1;j++)  vect[j]=vect[j+1];
          vect[n-1] = tmp;
        }
Если не так - я не виноват, на ++ не приходилось. Пробный запуск покажет.
Ввод и вывод, ес-но, пропускаю.
digitalis вне форума Ответить с цитированием
Старый 22.10.2022, 21:07   #3
Evgeny173
 
Регистрация: 21.10.2022
Сообщений: 8
По умолчанию

Могу предложить такой вариант:

Код:
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    size_t n, i, l;
    vector<int> A;

    cout<<"Enter vector size (N > 0): ";
    cin>>n;

    cout<<"Enter vector values: ";
    for( i = 0; i < n; ++i )
    {
        int val;
        cin>>val;
        A.push_back(val);
    }

    cout<<"Enter shift value (l > 0): ";
    cin>>l;

    l %= n; // shift no more than vector size

    int buf;

    // left invertion
    for( i = 0; i < l/2 ; ++i )
    {
        buf = A[i];
        A[i] = A[l-1-i];
        A[l-1-i] = buf;
    }
    // right inversion
    for( i = 0; i < (n-l)/2 ; ++i )
    {
        buf = A[i+l];
        A[i+l] = A[n-1-i];
        A[n-1-i] = buf;
    }
    // full inversion
    for( i = 0; i < n/2 ; ++i )
    {
        buf = A[i];
        A[i] = A[n-1-i];
        A[n-1-i] = buf;
    }

    cout<<"Result: ";
    for( i = 0; i < n; ++i )
        cout<<A[i]<<' ';

    cout<<endl;

    return 0;
}
Evgeny173 вне форума Ответить с цитированием
Старый 23.10.2022, 10:15   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,551
По умолчанию

Конкурс: а ещё длиннее кто может написа'ть ? Moim zdaniem, простые задачи решаются простыми средствами.
digitalis вне форума Ответить с цитированием
Старый 24.10.2022, 19:32   #5
Evgeny173
 
Регистрация: 21.10.2022
Сообщений: 8
По умолчанию

digitalis, ну там половина кода - это удобный интерфейс для ввода значений и вывода результатов. Вторая половина - быстрый сдвиг массива, без вложенных циклов, за O(n) операций.
Evgeny173 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклический сдвиг Muay Anila Помощь студентам 1 21.05.2016 20:46
Циклический сдвиг alex88fcsr Общие вопросы C/C++ 0 04.05.2015 16:47
циклический сдвиг browserpro Помощь студентам 0 08.12.2011 20:48
Циклический сдвиг в С rand8154 Общие вопросы C/C++ 1 14.11.2009 01:49
Циклический сдвиг Mish92(21-09) Помощь студентам 0 07.11.2009 21:59