The problem is that you initialize min
and max
to an value that might not be even.
The following is an efficient solution that handles empty arrays, arrays containing only odd numbers, and arrays containing only INT_MAX
:
int A[] = {1,2,3,4,5,6,7,8,9,10};
size_t n = 10;
size_t found_even = 0;
int min, max;
while (n--) {
int val = A[n];
if ((A[n] & 1) == 0) { // Assumes a 2's complement machine.
if (found_even++) {
if (A[n] < min) min = A[n];
else if (A[n] > max) max = A[n];
} else {
min = val;
max = val;
}
}
}
if (found_even) {
printf("Minimum even: %d\n", min);
printf("Maximum even: %d\n", max);
} else {
printf("Minimum even: <none>\n");
printf("Maximum even: <none>\n");
}
Slightly faster:
int A[] = {1,2,3,4,5,6,7,8,9,10};
size_t n = 10;
int found_even = 0;
int min, max;
while (n--) {
int val = A[n];
if ((A[n] & 1) == 0) { // Assumes a 2's complement machine.
min = val;
max = val;
found_even = 1;
break;
}
}
if (found_even) {
while (n--) {
if ((A[n] & 1) == 0) {
if (A[n] < min) min = A[n];
else if (A[n] > max) max = A[n];
}
}
printf("Minimum even: %d\n", min);
printf("Maximum even: %d\n", max);
} else {
printf("Minimum even: <none>\n");
printf("Maximum even: <none>\n");
}