В идеале вы хотели бы сделать это за один проход, а не использовать вложенные циклы. Лучший способ - использовать некую структуру отображения, где ключ карты - это значение, которое вы рассчитываете, а значение карты - это число вхождений для этого значения.
В этом конкретном примере проще всего было бы создать одномерный массив, индекс которого соответствует рассчитываемому вами значению. Пример:
int sayilar[10]={5,6,2,1,4,2,5,5,5,2};
size_t counts[10] = {0};
size_t dups = 0;
...
for (i = 0; i < 10; i++)
{
/**
* Add one to the value of counts[k], where k == sayilar[i]
*/
counts[sayilar[i]]++;
/**
* If the count is equal to 2, add one to the value
* of dups. We use == 2 instead of > 1 so that we
* only count unique duplicates.
*/
if (counts[sayilar[i]] == 2)
{
dups++;
}
}
Так как этот цикл выполняется, counts
обновляется следующим образом:
counts[5] = 1;
counts[6] = 1;
counts[2] = 1;
counts[1] = 1;
counts[4] = 1;
counts[2] = 2; dups = 1;
counts[5] = 2; dups = 2;
counts[5] = 3;
counts[5] = 4;
counts[2] = 3;
К сожалению, этот подход не очень хорошо масштабируется, если вы отслеживаете очень широкий диапазон значений или значений, которые не являются целыми числами.
Языки, такие как C ++ и Java, предоставляют встроенный тип данных карты, который обычно строится поверх некоторой сбалансированной древовидной структуры, такой как красно-черное дерево, которое на превышает излишнего для этой конкретной проблемы. ,