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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2012, 18:02   #1
xEk
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 19
По умолчанию Является ли массив перестановкой?

Дан целочисленный массив размера N. Если он является перестановкой, т.е. содержит все числа от 1 до N, то вывести 0, в противном случае вывесте номер первого недопустимого элемента.
Вот написал код, отсортировав массив и проверив является ли он перестановкой, не знаю как теперь вывести номер недопустимого элемента из неотсортированого массива...Как это реализовать?
Код:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
    int n=9,i,k,d,j,f;
    int a[n];
    for(i=0;i<n;i++)
    {
        printf("Enter a[%d] element massiva: ", i + 1);
        scanf("%d", &a[i]);
    }
       printf("\n\nARRAY A\n\n");
       for(i=0;i<n;i++)
      printf("%4i",a[i]);

    for(d=0;d<n-1;d++)
     for(j=d+1;j<n;j++)
      {
          if(a[d]<a[j])
          {
              k=a[d]; a[d]=a[j]; a[j]=k;
          }
      }
  printf("\n\nARRAY A\n\n");
    for(i=0;i<n;i++)
      printf("%4i",a[i]);

    f=1;
    for(i=0;i<n;i++)
    {
        if(a[i]!=i + 1)
        {
            f=0;
            break;
        }

    }

    if(f==0)
        printf("\n\nNe tot element massiva");
    else
      printf("\n\nPerestanovka");

return 0;
}
Если что то не так или можно улучшить код, пишите.

Последний раз редактировалось xEk; 10.05.2012 в 18:06.
xEk вне форума Ответить с цитированием
Старый 10.05.2012, 20:47   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Первый недопустимый элемент - это, скорее всего, тот, который повторяется.
1. Сортируем КОПИЮ исходного массива.
2. Заводим 3-й массив и собираем в него все повторяющиеся числа.
3. Заводим булев массив по длине равный 3-му. Инициализируем FALSE.
4. Проходим по исходному массиву:
- если встречаем число из 3-го массива (это первое вхождение), переводим соответствующий логический элемент в TRUE,
- если встречаем число из 3-го массива, причем соотв.лог.элемент = TRUE, - это искомый элемент (повтор ранее встретившегося.

Пока писал, пришла в голову другая идея:
1. Заводим логический массив равный исходному, инициализируем FALSE.
2. Пробегаем по исходному массиву, переводя в TRUE элемент с индексом равным очередному элементу массиву.
3. Как только встретим в нужной ячейке лог.массива TRUE - хначит, повтор, т.е. нашли недопустимый элемент.
s-andriano вне форума Ответить с цитированием
Старый 10.05.2012, 22:12   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

В дополнение к последнему способу s-andriano:
Если элемент больше N или меньше 1, то тоже недопустимый (сразу выход, а не запись в массив).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.05.2012, 22:32   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
В дополнение к последнему способу s-andriano:
Ну да.
К первому способу это уточнение тоже подходит.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифрование просто перестановкой SnowSin Помощь студентам 2 08.10.2015 20:47
Listbox с перестановкой Jl6owa Компоненты Delphi 0 06.01.2012 18:04
Задачка с перестановкой значений в двумерном масиве sekator Visual C++ 2 28.07.2010 14:33
шифрование перестановкой Ketu Помощь студентам 1 28.03.2009 12:30
является ли перестановкой массив размера M? playboy Паскаль, Turbo Pascal, PascalABC.NET 6 23.11.2008 12:03