Напечатать элементы массива, частота встречаемости которых минимальна - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нужна помощь с задачей: Задан массив m[n], элементами которого являются "длинные" целые числа. Напечатать все те элементы массива,частота встречаемости которых минимальна. то есть если я правильно понял,то нужно вывести все не повторяющиеся элементы ? я написал такой код, все компилится, но программа не работает,а я не могу понять почему
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void fill(long int* mass,int size,long a,long b)
{
    int i;
    srand((unsigned int)time(0));
    for(i=0;i<size;i++)
    {
            mass[i]=(b-a)*((long int)rand())/RAND_MAX+a;
    }
}
void displayMinimalOccurence(long int* mass,int size)
{
    int i,j,k;
    for(i=0;i<size;i++)
        {
            k=0;
            for(j=0;j<size;j++)
                {   
                    if(mass[i]==mass[j])
                        k++;
                    if(k==1)
                        printf("%l, ",mass[i]);
                }
        }
}
 
void main()
{
    long int* mass,a,b;
    int size;
    
    printf("Zadaite razmer massiva\n");
    scanf("%d",&size);
    mass=(long int*)malloc(sizeof(long int)*size);
    
    printf("Zadaite otrezok zapolnenia[a,b]\n");
    scanf("%l %l",&a,&b);
    
    fill(mass,size,a,b);
    displayMinimalOccurence(mass,size);
    system("pause");
}

Решение задачи: «Напечатать элементы массива, частота встречаемости которых минимальна»

textual
Листинг программы
#include <malloc.h>
#include <stdio.h>
 
void PrintOft(long int *Arr, int n)
{
    long int *V;
    int *F;
    int i,j,k,min,q;
 
    V=(long *) calloc(n,sizeof(long int)); /* уникальные значения */
    F=(int *) calloc(n,sizeof(int)); /* частоты повторения */
 
    k=-1;
 
    for (i=0; i<n; i++)
    {
        q=0;
        for (j=0; j<=k; j++)
            if (V[j]==Arr[i])
            {
                q=-1;
                F[j]++;
                break;
            }
        if (q==0)
        {
            k++;
            V[k]=Arr[i];
            F[k]=1;
        }
    }
 
        /* ищем минимальную частоту */
 
    min=F[0];
    for (i=0; i<k; i++) if (F[i] < min) min=F[i];
    
        /* печать элементов с минимальной частотой */
 
    for (i=0; i<k; i++) if (F[i]==min) printf("%d ",V[i]);
 
    printf("\n");
 
    free(V);
    free(F);
 
}
 
int main(int argc, char* argv[])
{
    long int A[15]={1,1,1,123,45,736,-6,123,736,45,45,45,-6,-6,-6};
    PrintOft(A,15);
    return 0;
}

Объяснение кода листинга программы

В этом коде:

  1. #include - подключаем стандартную библиотеку для ввода-вывода данных
  2. #include - подключаем стандартную библиотеку для работы с памятью
  3. *void PrintOft(long int Arr, int n)** - функция для печати уникальных элементов массива с минимальной частотой встречаемости
  4. *long int V;** - переменная-указатель для хранения уникальных значений
  5. *int F;** - переменная-указатель для хранения частоты встречаемости уникальных значений
  6. int i,j,k,min,q; - переменные для управления циклом и поиска минимальной частоты
  7. *V=(long ) calloc(n,sizeof(long int));** - выделяем память под массив уникальных значений
  8. *F=(int ) calloc(n,sizeof(int));** - выделяем память под массив частоты встречаемости
  9. k=-1; - инициализируем переменную для хранения индекса последнего уникального значения
  10. for (i=0; i<n; i++) - цикл по всем элементам массива
  11. q=0; - переменная для проверки уникальности текущего элемента
  12. for (j=0; j<=k; j++) - цикл по уже найденным уникальным значениям
  13. if (V[j]==Arr[i]) - проверка на уникальность текущего элемента
  14. { - если текущий элемент уже встречался
  15. q=-1; - меняем значение переменной q для выхода из цикла
  16. F[j]++; - увеличиваем частоту встречаемости текущего уникального значения
  17. break; - выходим из внутреннего цикла
  18. if (q==0) - если текущий элемент уникален
  19. { - инициализируем новый уникальный элемент
  20. k++; - увеличиваем индекс последнего уникального элемента
  21. V[k]=Arr[i]; - сохраняем текущий элемент как уникальный
  22. F[k]=1; - устанавливаем частоту встречаемости нового уникального элемента равной 1
  23. } - закрываем блок if для проверки уникальности текущего элемента
  24. min=F[0]; - инициализируем переменную для хранения минимальной частоты встречаемости
  25. for (i=0; i<k; i++) if (F[i] < min) min=F[i]; - ищем минимальную частоту встречаемости
  26. for (i=0; i<k; i++) if (F[i]==min) printf(%d,V[i]); - печатаем элементы с минимальной частотой встречаемости
  27. printf(\n); - выводим символ новой строки
  28. free(V); - освобождаем память под массив уникальных значений
  29. free(F); - освобождаем память под массив частоты встречаемости
  30. *int main(int argc, char argv[])** - функция главного цикла программы
  31. long int A[15]={1,1,1,123,45,736,-6,123,736,45,45,45,-6,-6,-6}; - инициализируем массив для тестирования функции
  32. PrintOft(A,15); - вызываем функцию для печати уникальных элементов массива
  33. return 0; - завершаем программу

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы