Определить, сколько значений элементов в массиве встречается более одного раза - C (СИ)
Формулировка задачи:
Дан одномерный массив А, состоящий из N элементов. Сколько значений
элементов в массиве А встречается более одного раза?
Решение задачи: «Определить, сколько значений элементов в массиве встречается более одного раза»
textual
Листинг программы
/* ANSI C 99 */
#include <stdio.h>
#include <glib.h>
#define MEETS_MORE_THAN (1)
int main(void) {
int array[] = { 5, 9, 1, 0, 5, 5, 8, 1, 0, 0, 5, 7, 9 };
GHashTable * map = g_hash_table_new(g_int_hash, g_int_equal);
for ( int i = 0; i < G_N_ELEMENTS(array); ++i )
g_hash_table_insert(map, array + i, GINT_TO_POINTER(GPOINTER_TO_INT(g_hash_table_lookup(map, array+i)) + 1));
int count = 0;
GHashTableIter iter;
gpointer key, value;
g_hash_table_iter_init(&iter, map);
printf("Value\tMeets\n");
while ( g_hash_table_iter_next(&iter, &key, &value) ) {
printf("%d\t%d\n", *(int*)key, GPOINTER_TO_INT(value));
if ( GPOINTER_TO_INT(value) > MEETS_MORE_THAN )
++count;
}
printf("%d values meets more than %d time(s).\n", count, MEETS_MORE_THAN);
g_hash_table_remove_all(map);
return 0;
}
Объяснение кода листинга программы
В этом коде используется g_hash_table для подсчета количества вхождений каждого значения в массиве. Вот список действий:
- Создается массив и хеш-таблица.
- В цикле заполняется хеш-таблица. Ключ - это элемент массива, значение - количество его вхождений плюс единица.
- В цикле перебираются все элементы хеш-таблицы и выводится количество вхождений каждого элемента.
- Выводится общее количество значений, которые встречаются более одного раза.
- Все элементы хеш-таблицы удаляются.
- Возвращается ноль.