Пример кода был упрощен, и имеет больше комментариев
Вот некоторые предлагаемые шаги:
1) предполагая int a[]
отсортирован (для простоты подсчета) (по возрастанию или убыванию, Это не имеет значения).
2) Создание отдельных массивов, чтобы держать найдены результаты где
первых один, num[]
хранит уникальное значение, и
второгоcnt[]
хранит количество этого значения не найдено.
3) цикл через отсортированный массив.
4) в цикле, хранить уникальное значение и количество встречаемости в массиве keep.
Распределяющей рутинного qsort()
это понятие вы узнаете позже, если вы только начинаете, (не отвлекайтесь с ним сейчас) но делают наблюдать часть этого примера решения вашего вопроса, смотрите для комментариев "Посмотри здесь". Как описано выше, он проходит через массив и сохраняет информацию о том, когда числа меняются, и сколько из них есть.
Вот небольшой пример кода:
Посмотрите на комментарии, чтобы знать, где сосредоточить внимание на установки счетчиков и т.д.
#include <stdio.h>
#define sizea 100 //to make variable declarations easier and consistent
int num[sizea];//unless array has all unique numbers, will never use this many
int cnt[sizea];//same comment
int cmpfunc (const void * a, const void * b);//DISREGARD for now (it just works)
int main(void)
{ //a[] is created here as an unsorted array...
int a[sizea]={1,3,6,8,3,6,7,4,6,9,0,3,5,12,65,3,76,5,3,54,
1,3,6,89,3,6,7,4,6,9,0,4,5,12,65,3,76,5,3,54,
1,9,6,8,3,45,7,4,6,9,0,89,5,12,65,3,76,5,3,54,
6,3,6,8,3,6,7,4,6,9,0,23,5,12,65,3,76,5,3,54,
1,3,6,90,3,6,7,4,6,9,0,5,5,12,65,3,76,5,3,54};
int i, j, ncount;
for(i=0;i<sizea;i++) cnt[i] = -1;
for(i=0;i<sizea;i++) num[i] = -999;
//sort array (AGAIN - DON'T spend time on this part, it just sorts the array)
qsort(a, sizea, sizeof(int), cmpfunc);
// a is NOW SORTED, in ascending order, now loop through...
j=0; //start num and cnt arrays at first element and set ncount to 1
num[j] = a[0];
cnt[j] = 1;
ncount = 1;//start off with at least one of the first number
//***Look Here***//
for(i=0;i<sizea-1;i++)//"sizea - 1" so we do not go past a[sizea-1] elements
{ //a has sizea elements, indexed from 0 to sizea-1
//or a[0] to a[99]
if(a[i+1] != a[i])
{
j++; //new unique number, increment num[] array
num[j] = a[i+1];
ncount = 1; //different number start over
cnt[j] = ncount;//initialize new cnt[j] with 1
}
else
{
cnt[j] = ++ncount; //increment cnt, apply it to array
}
}
i=0;
//We now have a list of unique numbers, and count of each one. Print it out
for(i=0;i<j;i++)
{
printf("number %d occurs %d times\n", num[i], cnt[i]);
}
getchar(); //so results will show.
return 0;
}
//Note num[j] and cnt[j] correspond to each other
//num contains a unique number
//cnt contains the number of occurrences for that number
int cmpfunc (const void * a, const void * b)
{
return (*(int*)a - *(int*)b);
}
Для примера массива включены, вот результаты, используя этот код:
Опубликовать код и магия произойдет –
Ваш подход звучит обычно правильно. Что это за массив? Интс? строки? – Alec
это массив ints, плохо попытайтесь посмотреть, могу ли я написать код для того, что ive придумал до сих пор – user3027779