2016-08-12 3 views
0
void main() 
    { 
     int x[19]={0}, i=0, y=0, u=0, p; 
     while (i<=19) 
     { 
      scanf("%d",&x[i]); 
      i=i+1; 
     } 
     for (i=u;i<=19;i++) 
     { 
      if (x[y]!=x[i+1]) 
       p=x[y]; 
       else 
       { 
        u++; 
        y++; 
       } 
     } 
     printf("%d",p); 
    } 

Так что я использовал это, чтобы проверить наличие дубликатов & он должен напечатать не являющихся дубликаты, но, как вы можете видеть, что это работает, если все являются дубликатами, но один, как в х [0] = 1 х [1] = 1 х [3] = 9 x [4] = 1 ... x [19] = 1;как обнаружить дубликаты в массивах и распечатать не дубликаты?

prints 
     9 

Так как печатать не дубликаты? Любая помощь ?

+0

Сторона примечания: попробуйте сделать привычкой не использовать имена переменных одной буквы. – elslooo

+1

O (n2) или сортировка или хеш-таблица. – Pawel

+0

@Pawel в зависимости от требований, это также будет отличным приложением для вероятностной структуры данных (цветной фильтр). – elslooo

ответ

0

Одним из простейших способов является сортировка массива для группировки дубликатов. Затем, когда вы проходите через массив, вы печатаете только номер, если он отличается от числа, которое было раньше.

// Print the unique elements of a sorted array: 
for(int i=0; i<N; i++){ 
    if (i-1 >= 0 && arr[i] == arr[i-1]) { continue; } 
    if (i+1 < N && arr[i] == arr[i+1]) { continue; } 
    printf("%d\n", arr[i]); 
} 

Для сортировки массива можно использовать функцию qsort

+0

Это не будет печатать только уникальные элементы, но один из каждого элемента.Но поскольку вопрос неясен, возможно, это то, что он хочет. – Eiko

+0

Нет Мне нужно распечатать только уникальные элементы. @Eiko –

+0

Существует простое исправление: напечатайте только номер, если он отличается от того, кто пришел раньше * и *, который приходит после. См. Мое редактирование. – hugomg

0

Это было бы самым простым решением, просто гнездо для дополнительного контура. Однако это берет O (n^2). В зависимости от размера массива, может быть полезно взглянуть на быстрый вид. более

void main() { 
    int x[4] = { 1, 3, 2, 1 }; 

    size_t i, j; 
    for (i = 0; i < sizeof(x)/sizeof(int); i ++) { 
     // Note that we only have to go to the last value before i. 
     for (j = 0; j < i; j ++) { 
      // We break if the value is a duplicate. 
      if (x[i] == x[j]) 
       break; 
     } 

     // Check if the inner loop was break'ed (j < i) or not (j == i). 
     if (j == i) 
      printf("Unique: %i\n", x[i]); 
    } 
} 

одно: использовать только sizeof(x)/sizeof(int) если размер x известен во время компиляции. Это здесь, но не используйте его с malloc.

+0

Мне потребовалось некоторое время, чтобы изучить это, я просто не понимаю 'sizeof (x)/sizeof (int)', что это значит? –

+0

Это измерение вашего массива 'x' от int, поэтому 4. Однако я добавил предупреждение, чтобы указать, что это работает только для статически распределенных массивов. – elslooo

+0

Да, я получил его, спасибо @Tim –

0
void main() 
{ 
    int num[20]={0}, i=0, n=0, index_num=0, init_incr=0, unique=0, n_uniq=1, temp, check=0; 
    while (i<=19) 
    { 
     printf("%02d- ",i+1); 
     scanf("%d",&num[i]); 
     i=i+1; 
    } 
    for (index_num=0;index_num<19;index_num++) 
    { 
     for (n=init_incr+index_num;n<19;n++) 
     { 
      if (num[index_num]!=num[index_num+1] && num[index_num]!=num[index_num-1]) 
      { 
       check++; 
       temp=num[index_num]; 
       unique=temp; 
       for (;n_uniq<=check;n_uniq++) 
       printf("\tunique %02d = %d\n", n_uniq, unique); 
       break; 
      } 
     } 
    } 
} 
+0

Спасибо вам за помощь: D –

Смежные вопросы