#include int min(int a, int b) { return a < b ? a : b; } int max(int a, int b) { return a > b ? a : b; } /** * Checks if provided arr includes an element starting from {@param headStart} * position * * @returns zero to indicate the element was not found, one to indicate found */ int arrContains(int element, int arr[], int arrLen, int headStart) { for (int i = headStart; i < arrLen; i++) { if (element == arr[i]) return 1; } return 0; } void arrFill(int filler, int arr[], int arrLen) { for (int i = 0; i < arrLen; i++) { arr[i] = filler; } } int main() { int arr[] = { 2, 4, 5, 1, 2, 8, 6, 6 }; int size = sizeof(arr) / sizeof(int); // keep track of individual processed duplicates so that we won't account // for the same duplicate element twice int duplicates[size]; int duplicateI = 0; arrFill(0, duplicates, size); // we can't have random values // notice that duplicate arr is filled with zeros, but original array // can also contain duplicates of zeros int zeroImpact = -1; for (int i = 0; i < size; i++) { int it = arr[i]; if (it == 0) { // handle the case of zero separately zeroImpact++; continue; } else if (arrContains(it, duplicates, size, 0)) { continue; // value is already processed as duplicate } if (arrContains(it, arr, size, i + 1)) duplicates[duplicateI++] = it; } // if there are no duplicate of zeros, increment by 0; otherwise increment // by 1 at most printf("%d duplicates found.", duplicateI + max(0, min(1, zeroImpact))); }