Консультация № 188562
27.12.2015, 18:31
0.00 руб.
0 1 1
Здравствуйте! Помогите, пожалуйста, разобраться с задачей. Дано условие:
Дан целочисленный массив размера N. Если он является перестановкой, то есть содержит все числа от 1 до N, то вывести 0; в противном случае вывести номер первого недопустимого элемента.


Приложение:
#include <stdio.h>
#include <stdlib.h>

#define N 10

int main(int argc, char *argv[]){
int array[N];
int N;
printf("Введите число : ");
scanf("%d",&N);
if (N<=0)
{
printf("Были указаны неправильные значения\n");
system("pause");
return 0;
}
//Заполнение массива случайными числами
for(i=0;i<N;i++)
{
array[i][i]=-10 + rand()%56;
printf("%3d ", array[i][i]);
}
printf("\n");
}
int checker[N] ;
int i;
(void)memset(checker, 0, N*sizeof(int));
for(i = 0 ; i < N ; i++){
if(!checker[array[i] - 1])
{
++checker[array[i] - 1] ;
}
else
{
printf("\r\n wrong %d \r\n", array[i]) ;
system("pause");
return 0 ;
}
}

printf("\n\r 0 \n\r") ;
system("pause");
return 0;
}

Обсуждение

давно
Посетитель
7438
7205
28.12.2015, 01:22
общий
это ответ
Здравствуйте, fridge!
Комментариев не писал, если что непонятно, спрашивайте в мини=форуме.
Идея такая: считаем числа, которые попадают в интервал [1;N], если какого-то числа нет, то счетчик будет равен 0
[code h=200]
/*
Дан целочисленный массив размера N.
Если он является перестановкой, то есть содержит все числа от 1 до N,
то вывести 0; в противном случае вывести номер первого недопустимого элемента
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <malloc.h>

int main(int argc, char *argv[])
{
int N;

SetConsoleCP(1251);
SetConsoleOutputCP(1251);

printf("Введите число: ");
scanf("%d",&N);
if (N<=0)
{
printf("Были указаны неправильные значения\n");
system("pause");
return 0;
}

int *array = (int*)malloc(N*sizeof(int));
int *checker = (int*)calloc(N,sizeof(int));
int i;

//Заполнение массива случайными числами
for(i=0;i<N;i++)
{
array[i]=1 + rand()%10;
printf("%3d ", array[i]);
}
printf("\n");

for(i=0; i<N; i++)
{
if (array[i]<N+1)
checker[array[i]-1]++;
}

int iRet = 0;

for(i=0; i<N; i++)
{
if (checker[i] == 0)
{
iRet = i+1;
break;
}
}
if (iRet == 0)
printf("Найдены все числа\n");
else
printf("Ненайденное число = %d\n", iRet);
system("pause");
free(array);
free(checker);
return 0 ;
}
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа