Форум программистов, компьютерный форум CyberForum.ru

Одномерный массив. Циклический сдвиг вправо - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Правило хорошо тона при Рендеринге !? http://www.cyberforum.ru/cpp-beginners/thread777792.html
Появился такой вопрос, правильно ли запихивать указатель на устройство рендеринга в объект. Class Object { //.. D3DXDEVICE * pVideoCard; //.. } или схожий пример для обертки над DirectX Class Object {
C++ Build Error 1. откуда взялся? в универе простые задачки решали письменно, решила попробовать прогу создать по одной из простеньких что было. вроде все правильно,но выбило ошибку Build Error 1 . в чем причина?? #include<stdio.h> #include<stdlib.h> int main() {int i; int R; for (i=0;i>=255;i++) R=rand; for (i=0;i>=255;i++) printf("yniversal'noe mno*estvo: %d", R); http://www.cyberforum.ru/cpp-beginners/thread777785.html
C++ Чётные числа на нечётных местах
Доброго времени суток, уважаемые форумчане! Уже больше 10 часов бьюсь на задачей, но почти безрезультатно. Перерыла весь интернет, и здесь искала, но того что мне нужно не нашла. Задание такое: Дано n, a. Определить количество чётных чисел, стоящих на нечётных местах. Помогите, пожалуйста, две задачи из трёх сделала, если эту не сделаю - отчисление из колледжа :( Я смогла вывести массив на...
C++ Что за входным параметром DynamicArray(long s = 10): size(s), count(0)?
: size(s), count(0) объясните что это ? //конструкторы DynamicArray(long s = 10): size(s), count(0) { //<=======================что это? p = new T; if(!p) cout << "Ошибка при создании массива" << endl; }
C++ сумма ряда 1,3,5,7 http://www.cyberforum.ru/cpp-beginners/thread777752.html
# include <stdio.h> # include <conio.h> #include <iomanip> int main () { setlocale(LC_ALL,"Russian"); int i,n,s=0; printf ("\n Введите количество первых нечетных чисел которые необходимо просумировать n=\n"); scanf ("%d",&n);
C++ функция для нахождения длины связного списка Помогите написать функцию для нахождения длины связного списка. реализуйте функцию итеративно и рекурсивно. getLength (NULL) должен возвращать 0. class List { public: int value; List* next; }; int getLength(List* list) подробнее

Показать сообщение отдельно
Байт
 Аватар для Байт
13941 / 8772 / 1220
Регистрация: 24.12.2010
Сообщений: 15,872
26.07.2016, 00:05     Одномерный массив. Циклический сдвиг вправо
Сразу оговорюсь. Я здесь рассматриваю немного не ту задачу, которая сформулирована в стартовом топике. А именно - циклический сдвиг массива размером n на произвольное число позиций s без использования дополнительных массивов.
Все оказалось не так тривиально в смысле реализации (кода), но идея не сложна, хоть и симпатична.
Если размер массива (n) и сдвиг (s) взаимно просты, то задачу решает следующий код.
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
void swap(int *a, int *b)
{  int t;
  t = *a;
  *a = *b;
  *b = t;
}
int main(int ac, char *av[])
{ int n=10, s=1, A[100], i, ii;
   if (ac > 1) n = atoi(av[1]);
   if (ac > 2) s = atoi(av[2]);
   printf("n=%d s=%d\n", n, s);
   for(i=0; i<n; i++) A[i] = i+1;
   ii = 0;
   for(i=0; i<n-1; i++) {
     swap(A+ii, A+(n+ii-s)%n);
     ii = (n+ii-s)%n;
   }
   for(i=0; i<n; i++) printf("%d ", A[i]);
   printf("\n");
}

Программа запускается из командной строки с параметрами Размер Сдвиг
sdvig 36 10
Если же Nd = Nod(n,s) не равен 1, то поступаем следующим образом.
Разбиваем исходный массив на Nd подмассивов размером n/Nd. Элементы каждого подмассива отстоят друг от друга на Nd (поэтому и требуется функция Ind).
Сдвиг тоже делим на Nd. Теперь каждый из массивов удовлетворяет условию взаимной простоты размера и сдвига, и к ним применяется описанный алгоритм.
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
void swap(int *a, int *b)
{  int t = *a;
  *a = *b;
  *b = t;
}
int Nod(int a, int b)
{
  while(a!=0) {
    if (a < b) swap(&a, &b);
    a = a%b;
  }
  return b;
}
int Ind(int I, int m, int Nd)  // Перевод индекса подмассива в положение в исходном массиве
{
  return m + I*Nd;
}
int main(int ac, char *av[])
{ int n=10, s=1, A[100], i, ii, Nd, j, k;
   if (ac > 1) n = atoi(av[1]);
   if (ac > 2) s = atoi(av[2]);
   if (s < 0) s = n - s;
   s %= n;
   Nd = Nod(n, s);
   printf("n=%d s=%d Nd=%d\n", n, s, Nd);
   s /= Nd;
   for(i=0; i<n; i++) A[i] = i+1;
   k = n / Nd;  // Размер каждого массива
   for(j=0; j<Nd; j++) {  // Цикл по массивам
     ii = 0;
     for(i=0; i<k-1; i++) {
       swap(A+Ind(ii,j,Nd)%n, A+Ind(k+ii-s,j,Nd)%n);
       ii = (k+ii-s)%n;
     }
   }
   for(i=0; i<n; i++) printf("%d ", A[i]);
   printf("\n");
}
 
Текущее время: 06:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru