Распечатайте уникальные элементы в массиве на языке Си?

#arrays #c

Вопрос:

Проблема: Распечатайте уникальные элементы из массива. Пример: У нас есть {1,2,3,2,4,5,5,6], результат будет {1,2,3,4,5,6}.

Мне удается распечатать только {1,3,4,6}. Вот мой код:

 #include <stdio.h>

void input(int a[], int n);
void show(int a[], int n);

int main()
{
  int n, i;
  printf("Enter number of elements: "); scanf("%d", amp;n);
  int a[n];
  input(a,n);
  printf("nArray before change!n");
  show(a,n);
  printf("n----------------------------------------");
  printf("nArray after change!n");

  int b[101];
  for(i=0; i<101; i  )
      {
        b[i] = 0;
      }
  for (i=0; i<n; i  )
      {
        b[a[i]]  ;
      }

  for(i=0; i < n; i  )
      {
        int j = 0;
        if (b[a[i]] == 1)
            {
              printf("%d ", a[i]);
            }
      }
return 0;
}
//------------------------------------------------------------------------------
void input(int a[], int n)
{
  int i;
  for(i=0; i < n; i  )
      {
        printf("a[%d] = ", i);
        scanf("%d", amp;a[i]);
      }
}
void show(int a[], int n)
{
  int i;
  for(i=0; i < n; i  )
      {
        printf("%d ", a[i]);
      }
}
 

В приведенных выше кодах я использую массив b[] в качестве счетчика для подсчета наличия каждого элемента. Я остановился на том, что не могу печатать элементы, которые появляются более одного раза. У тебя есть какая-нибудь идея, как это взломать ? Я благодарю вас.

Комментарии:

1. if (b[a[i]] == 1) -> if (b[a[i]] >= 1)

2. Это приведет к результату, отличному от примера, потому что при этом будут выведены все элементы в массиве

3. С чего бы это? Все остальные b значения должны быть равны 0. Это основной смысл алгоритма. Нет? Ты пробовал это сделать?

4. Если это «>=1» вместо «==1», он также выведет время элемента n (n-счетчик наличия этого элемента). Но можете ли вы придумать какую-нибудь лучшую идею для решения этой проблемы ?

5. @QuanLeAnh Вам действительно нужно проверить if (b[a[i]] >= 1) , а затем установить b[a[i]] = 0; , когда условие истинно. На самом деле b массиву не нужно подсчитывать количество вхождений. Это просто должно быть 1, если число находится в массиве, и 0 в противном случае.

Ответ №1:

 #include <stdio.h>
void input(int a[], int n);
void show(int a[], int n);

int main(){
  int i=0,j,k=0,n;
  int a[10];
  int b[10];
  printf("Enter number of elements: "); //number of elements you want to store.
  scanf("%d", amp;n);
  input(a,n);
  printf("nArray before change!n");
  show(a,n);

  //removing duplicate elements from array.
    for(i=0; i<n ; i  ){
        for(j=i-1 ; j>=0 ; j--)
            if(a[j]==a[i])
                goto down;
        b[k  ] = a[i];  // storing unique elements in array b.
        down: ;
    }
    
  printf("n----------------------------------------");
  printf("nArray after change!n");
  show(b , k);
return 0;
}
//------------------------------------------------------------------------------
void input(int a[], int n){
  for(int i=0; i < n; i  )
        scanf("%d", amp;a[i]);
}

void show(int a[], int n){
  for(int i=0; i < n; i  )
        printf("%d ", a[i]);
}