查找数组中的最小偶数和最大偶数

Find the Min Even Integer and Max Even Integer in an Array

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?

min = A[1]; 这里 min 已经初始化为 1。所以,

if(min > A[i] && A[i]%2 ==0 ) min = A[i]; 条件永远不会为真。

添加头文件limits.h并初始化 min=INT_MAX; max=INT_MIN;

此测试用例暴露了代码的阴暗面之一,您已将 minmax 初始化为 A[1],而不管 A[1] 是奇数还是甚至。

问题:

可能存在数组不包含任何偶数的情况。在这种情况下,您可能希望打印 so 而不是打印 -1INT_MININT_MAX.

如果您是 INT_MININT_MAX 的新手,this 将在继续解决方案之前充当入门者。

解法:

此解决方案修改您的代码,使其能够处理所有情况,前提是您提供的输入没有任何错误。

  1. 有一个 flag 知道你是否找到了你的 minmax:

    int foundAnswer = 0;
    
  2. 添加头文件limits.h并初始化你的minmax为 如下:

    min = INT_MAX;
    max = INT_MIN;
    
  3. 修改您的循环,使标志发挥作用:

    注:

    不要无缘无故地浪费数组的第零个索引。 之前相应地修改数组声明和输入循环 改这个。

    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. How do I check if an integer is even or odd using bitwise operators

  2. 讨论的算法 here 将为您提供更好的时间复杂度来实现相同的目标。

问题是您将 minmax 初始化为一个可能不偶数的值。

以下是处理空数组、仅包含奇数的数组和仅包含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");
}