Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > C/C++/С#


Ответ
 
Опции темы Опции просмотра
Старый 27.03.2014, 04:45   #1 (permalink)
vitjok
Member
 
Регистрация: 29.09.2012
Сообщений: 72
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Алгоритм перестановки элементов

Здравствуйте. Кто нибудь подскажите алгоритм перестановки элементов таким образом:
дан вектор
исходный:
7894136
выходной:
6578941

перестановка производиться таким образом, что элемент в четной ячейке переходит в следующую четную,последняя четная в первую четную, а первая нечетная в сл нечетную, а последняя нечетная в первую.
img_20140326_223824.jpg
vitjok вне форума   Ответить с цитированием

Старый 27.03.2014, 04:45
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Возможно, данная тема уже решена ранее

Составить алгоритм и написать код
Составить алгоритм
Алгоритм rle
Описать алгоритм
Алгоритм
Алгоритм с возвратом

Старый 27.03.2014, 11:12   #2 (permalink)
Debianer
Member
 
Регистрация: 07.08.2012
Сообщений: 325
Сказал(а) спасибо: 14
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1671
По умолчанию

Ну, вкратце так:
У нас, как я понимаю, вектор фиксированной длины. Начнем с нечетных ячеек.
Последнее значение запоминаем во временную переменную, потом предпоследнее нечетное двигаем на последнее место и т.д. Т.е. сдвиг делаем из конца в начало. Финальным этапом записываем число из переменной в первое нечетное.
Таким же макаром гоняем и четные
Еще один вариант - гонять попарно:
Значения двух последних ячеек сохраняем в две переменные, делаем сдвиг, как и в предыдущем случае, только каждое число сдвигаем на +2, и потом значения из переменных записываем в первые две ячейки.
Второй вариант прокатит с вектором любой длины; единственное, сначала надо будет определить, последняя ячейка четная или нет. Если да, то просто сдвигаем все, как я указал выше. Если нет - сдвигаем все числа, а переменные при записи меняем местами.
Например, последняя ячейка вектора у нас четная. Значение предпоследней ячейки пишем в А, последней - в В. После сдвига содержимое А идет в 1-ю ячейку, содержимое В - во 2-ю.
Если последняя ячейка нечетная, то содержимое А идет во 2-ю ячейку, содержимое В - в 1-ю.
Debianer вне форума   Ответить с цитированием
Старый 27.03.2014, 16:46   #3 (permalink)
vitjok
Member
 
Регистрация: 29.09.2012
Сообщений: 72
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

код составил перестановка работает не совсем как должна, переставляем справа налево, а должна слева на право.
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
//#include <time.h>

int main()
{
	int i, n,m, v_min, v_max,temp;

	time_t t;		// текущее время для инициализации
				// генератора случайных чисел

	srand((unsigned) time(&t));	// инициализация генератора
							// случайных чисел


	printf("\nZadanie 1");

	printf("\nEnter the range of random numbers:\n");
	printf("\nv_min=");
	scanf("%d", &v_min);
	printf("\nv_max=");
	scanf("%d", &v_max);
	printf("\nLength vektora:");
	scanf("%d", &n);

	int vector[n];

	printf("\nOriginal vector:\n");

	m = v_max-v_min + 1;

	for (i=0; i<n; i++)
		{
				// получение случайного числа в диапазоне
				// от vector_min  до  vector_max
			vector[i]=rand()% m + v_min;
			printf(" %5d", vector[i]);
		}

	printf("\n");



for (i = 1; i < n-1; i++)
            {
                if (i % 2 == 0)
                {
                    temp=vector[i+1];
                  vector[i+1]=vector[i-1];
                  vector[i-1]=temp;

                  }
            }
for (i = 0; i < n-1; i++)
            {
                if (i % 2 != 0)
                {
                    temp=vector[i+1];
                  vector[i+1]=vector[i-1];
                  vector[i-1]=temp;

                  }
            }

			printf("\nObtained vector:\n");
			for (i=0; i<n; i++)
				{
					printf(" %5d", vector[i]);
				}

	printf("\n");
	return 0;
}
кто может помочь исправить?
vitjok вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 09:44.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.