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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2016, 14:09   #1
shoroh
Новичок
Джуниор
 
Регистрация: 02.01.2016
Сообщений: 3
По умолчанию Обработка массива

Дан массив из первых n натуральных чисел( т. е. произвольная перестановка из первых n натуральных чисел ). Преобразовать массив таким образом, чтобы в нем оказалась перестановка индексных номеров при приведении исходной перестановки к натуральной( решение дать без использования вспомогательного массива ). Т. е. если, например, 4 - 1-ый элемент массива, то в результате 4 - ым элементом массива должа стать 1. Паскаль или С.
shoroh вне форума Ответить с цитированием
Старый 02.01.2016, 14:27   #2
Viktor_Ptica
Пользователь
 
Регистрация: 23.12.2015
Сообщений: 22
По умолчанию

Что должно быть на выходе: этот же массив или другой?
Если задача кажется легкой - то решать её придется очень долго.
Viktor_Ptica вне форума Ответить с цитированием
Старый 02.01.2016, 14:29   #3
shoroh
Новичок
Джуниор
 
Регистрация: 02.01.2016
Сообщений: 3
По умолчанию

Этот же массив.
shoroh вне форума Ответить с цитированием
Старый 02.01.2016, 14:44   #4
Viktor_Ptica
Пользователь
 
Регистрация: 23.12.2015
Сообщений: 22
По умолчанию

тут нужно временное хранилище в любом случае. и лучше на n-1 элементов (для предотвращения потери данных). Кстати: если попадутся одинаковые числа - то любое решение будет не правильным. Идея есть сделать вместо двух массивов один двумерный. В первом столбце исходные данные, а во втором результат. И выводить только второй столбец.
Если задача кажется легкой - то решать её придется очень долго.
Viktor_Ptica вне форума Ответить с цитированием
Старый 02.01.2016, 14:57   #5
shoroh
Новичок
Джуниор
 
Регистрация: 02.01.2016
Сообщений: 3
По умолчанию

Ну, я же написал, что дана перестановка из первых n натуральных чисел, т.е. элементы попарно не равны. Вспомогательный массив использовать нельзя. Я решил, используя множества уже переставленных элементов, однако задачу мне дал друг с мех-мата, знающий только с, и, с его слов, реализацию множеств в с они не прошли.
Я решал так:
Код:
program mecmattask;
const 
    n = 8;
type
    limit = 1..n;
    vector = array[ limit ] of limit;
var
    x: vector;
    y: set of limit;
    count, k, sum: integer;

procedure readvector( var x: vector );
var
    i: integer;
begin
    writeln( 'Enter ', n, ' natural numbers:' );
    for i:= 1 to n do read( x[ i ] );
end;

procedure writevector( var x: vector );
var
    i: integer;
begin
    for i := 1 to n do write( x[ i ], ' ' );
end;

procedure swap( k: limit; var count: integer );
var
    index, item, m: limit;
begin
    count := 1;
    y := y + [ k ];
    if x[ k ] <> k then begin
        index := k;
        item := x[ k ];
        repeat
            count := count + 1;
            y := y + [ item ];
            m := x[ item ];
            x[ item ] := index;
            index := item;
            item := m;
         until item = k;
         x[ k ] := index;
    end;
end;

begin
readvector( x );
sum := 0;
k := 1;
while sum <> n do begin
    swap( k, count );
    sum := sum + count;
    while k in y do k := k + 1;
end;
writevector( x );
end.

Последний раз редактировалось Stilet; 02.01.2016 в 16:12.
shoroh вне форума Ответить с цитированием
Старый 02.01.2016, 15:12   #6
Viktor_Ptica
Пользователь
 
Регистрация: 23.12.2015
Сообщений: 22
По умолчанию

попробуйте циклом repeat пройтись по массиву. Вам понадобится счетчик (x: integer), 2 временнох хранилища элемента (i,y: integer) ну и сам массив
Код:
x:=0; //задаем начало счетчика
i:=0; // задаем начальное положение для обработки массива
repeat
 y:=mas[i]; //достаем из массива число
 mas[y]:=i; //вставляем в массив порядковый номер элемента
 i:=y;         //переходим к новому элементу, но не к i+1
x:=x+1;     // прибавляем счетчик (x++ кажется на Сях)
until x>Count(mas);  //проверяем количество операций больше количества записей в массиве
должно получиться как раз под вашу задачу. Код на Делфи, но думаю с переводом на Си проблем не возникнет
Если задача кажется легкой - то решать её придется очень долго.
Viktor_Ptica вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка массива с числами (разделить на два отдельных массива и вывести все числа, которые делятся на X ) Grag963 Помощь студентам 2 21.11.2013 16:51
Обработка массива Qusk Паскаль, Turbo Pascal, PascalABC.NET 0 25.04.2013 11:00
Обработка массива cat_gav Общие вопросы C/C++ 0 17.11.2012 18:35
инициализация массива, вывод массива и обработка массива должны быть реализованы с помоshью функций airesjke Помощь студентам 0 02.03.2012 16:14
Обработка массива (си) Pascaler Помощь студентам 1 01.06.2011 11:28