Напечатать элементы массива, частота встречаемости которых минимальна - 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;
}
Объяснение кода листинга программы
В этом коде:
- #include
- подключаем стандартную библиотеку для ввода-вывода данных - #include
- подключаем стандартную библиотеку для работы с памятью - *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; - меняем значение переменной q для выхода из цикла
- F[j]++; - увеличиваем частоту встречаемости текущего уникального значения
- break; - выходим из внутреннего цикла
- if (q==0) - если текущий элемент уникален
- { - инициализируем новый уникальный элемент
- k++; - увеличиваем индекс последнего уникального элемента
- V[k]=Arr[i]; - сохраняем текущий элемент как уникальный
- F[k]=1; - устанавливаем частоту встречаемости нового уникального элемента равной 1
- } - закрываем блок if для проверки уникальности текущего элемента
- 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; - завершаем программу