Другие языки программирования и технологии

помогите с задачей по си

нужно напечатать число которое появляется в массиве наибольшее колл-во раз.

перед этим нужно ввести массив

вот мои наработки

#include<stdio.h>

#define N 10

int arr[N];

void FillArray(int *arr,int nCount)

{

int i;

for(i=0;i<nCount;i++)

{

printf("Fill array [%d]:\n",i+1);

scanf("%d",&arr[i]);

}

}

void FindHist(int *arr,int nCount)

{

int hist[15];//array of monim

int i;

int max=0;

for(i=0;i<10;++i)

{

hist[i]=0;

}

for(i=0;i<N;++i)

{

++hist[arr[i]];

}

for(i=0;i<10;i++)

{

max=i;

}

printf("Number is %d",max);

}

void main()

{

FillArray(arr,N);

FindHist(arr,N);

}
Почему бы Вам его (или его копию) просто сперва обычным сишным qsort-ом не отсортировать? В отсортированном уже попроще будет работать. Да и сложность n*log(n) там будет вполне себе ничего, если гнаться за линейной задача не стоит.
П*
Папаня *
19 662
Лучший ответ
я 5 минут пытался понять, чего ты ждешь от FindHist, но потерпел крах =(
Вы пытаетесь сделать массив, который будет накапливать количество вхождений определённого элемента, а потом вывести самый частый. Это у вас не получается, но таким путем идти и не надо.
Такой способ оправдывается, если у вас количество допустимых значений ограничено.
Но никто не мешает в массив arr ввести числа +/- 2 млрд.

Предлагаю другой способ:
1. Завести служебный массив int cnt[N].
2. Его значения cnt[i] = {количество (j): arr[i]=arr[j], j >=i} - количество дублей arr[i] в хвосте.
3. Потом по cnt искать индекс i_max, на котором достигается максимум
4. Вывести cnt[i_max] и arr[i_max]

Этап 2 - просто двойной цикл
for (i=0…(N-1)) { cnt[i] = 1; for (j=(i+1)…(N-1)) if (arr[i]==arr[j]) cnt[i]++; }

ЗЫ
paperrose попытался сделать без массива. У него НЕ ПОЛУЧИЛОСЬ.
Это тоже можно и в моём варианте:
После завершения for (j) можно сравнивать только что найденную cnt c предыдущей максимальной, как делает он.
Хотя вариант с массивом проще отлаживать и он нагляднее.
Апельсин *
Апельсин *
11 112
void FindHist(int *arr,int nCount){
int i, result, max = 0, ind = 0;
for (i =0; i < N; i++) {
result = 0;
while ((--nCount) != -1)
if (arr[nCount] == value) result++;
if (result > max) {
max = result;
ind = i;
}
}
printf("Number is %d",arr[ind]);
}
Семён Струев
Семён Струев
4 543
int check (int *arr, int nCount, int value) {
while ((--nCount) != -1)
if (arr[nCount] == value)

result++;

return result
}

void FindHist(int *arr,int nCount){

int i, result, max = 0, ind = 0;

for (i =0; i < N; i++) {
if (check(arr, nCount, arr[i])> max) {

max = result; ind = i;

}

}

printf("Number is %d",arr[ind]);

}

вроде так надо подправить код paperrose