Найдите минимальное целое число и максимальное целое число в массиве - PullRequest
2 голосов
/ 28 января 2020
int  i,max,min;
int  A[11];
    min = A[1];
    max = A[1];
    for(i=1;i<=10;i++)
    {
        if(min > A[i] && A[i]%2 ==0 )  min = A[i];
        if(max < A[i] && A[i]%2 ==0 ) max = A[i];
    }
    printf("Minimum  Even : %d\n",min);
    printf("Maximum  Even : %d\n",max);
    getch();
}

Когда я заполняю свой массив 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Почему минимальное четное число равно 1?

enter image description here

Ответы [ 3 ]

3 голосов
/ 28 января 2020

Этот тестовый пример демонстрирует одну из темных сторон вашего кода, где вы инициализировали min и max A[1] независимо от того, является ли A[1] нечетным или четным.

Проблема:

В некоторых случаях массив не содержит четных чисел. В таких случаях вы можете печатать sh вместо печати -1 или INT_MIN или INT_MAX.

Если вы новичок в INT_MIN и INT_MAX, это будет служить отправной точкой перед переходом к решению.

Решение:

Это решение изменяет ваш код таким образом, что оно обрабатывает во всех случаях, когда вы предоставляете входные данные без ошибок.

  1. Имеют флаг , чтобы узнать, нашли ли вы min и max :

    int foundAnswer = 0;
    
  2. Добавьте файл заголовка limits.h и инициализируйте min и max следующим образом:

    min = INT_MAX;
    max = INT_MIN;
    
  3. Измените ваш l oop так, чтобы флаг служил цели:

    Примечание:

    Не тратьте нулевой индекс вашего массив без какой-либо причины. Измените объявление массива и, соответственно, введите l oop перед его изменением.

    for (i = 0; i < ARRAY_SIZE; ++i)
    {
     if (A[i] % 2 == 0)
     {
      foundAnswer = 1;
      if (A[i] < min) min = A[i];
      if (A[i] > max) max = A[i];
     }
    }
    
  4. Немного измените код печати, чтобы охватить все случаи.

    if (foundAnswer)
    {
     // Print min
     // Print max
    }
    else
    {
     // Print "min and max not found"
    }
    

Бонус:

Чтобы оптимизировать код, воспользуйтесь следующими ссылками:

  1. Как проверить, является ли целое число четным или нечетным, используя побитовые операторы

  2. Обсуждаемые алгоритмы здесь обеспечат вам лучшую временную сложность добиться того же.

1 голос
/ 28 января 2020

Проблема в том, что вы инициализируете min и max значением, которое может быть не четным.

Ниже приведено эффективное решение, которое обрабатывает пустые массивы, массивы, содержащие только нечетные числа, и массивы содержит только 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");
}

Чуть быстрее:

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");
}
0 голосов
/ 28 января 2020

min = A[1]; Здесь min уже инициализировано в 1. Итак, условие

if(min > A[i] && A[i]%2 ==0 ) min = A[i]; никогда не будет истинным.

Добавьте файл заголовка limits.h и инициализируйте min=INT_MAX; max=INT_MIN;

...