【问题标题】:Find the Min Even Integer and Max Even Integer in an Array在数组中查找最小偶数和最大偶数
【发布时间】:2020-05-13 11:53:41
【问题描述】:
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?

【问题讨论】:

  • 为什么要浪费一个额外的数组索引?
  • 不要把图像显示输出。使用proper formatting

标签: c arrays max min


【解决方案1】:

这个测试用例暴露了代码的阴暗面之一,您将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 讨论的算法将为您提供更好的时间复杂度来实现相同目标。

【讨论】:

  • 您的错误报告和第一个提示是基于数组的所有元素都相似的情况。我已经根据您的建议更新了我的解决方案。谢谢@ikegami
  • 我很欣赏INT_MAX 很奇怪的事实。我已将&lt;=&gt;= 替换为&lt;&gt;。然而,这样做的真正原因是minmax 分别被初始化为INT_MAXINT_MIN。回复 “我说 findmin 和 findmax 总是相同的”: 您还跟进了它,在我的第二个 if 之前添加了一个 else 到代码中,这在编辑历史中也可见。在数组大小为 1 且唯一元素为偶数的情况下,这将失败。无论如何,我已经根据需要更新了我的代码@ikegami
  • 回复:“啊,是的,这是一个错误。” 不用担心,很高兴与您一起解决这个问题。我还是个学生;你给了我一些团队合作的经验。您的建议和错误报告是正确的。谢谢@ikegami
【解决方案2】:

问题是您将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");
}

【讨论】:

    【解决方案3】:

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

    if(min &gt; A[i] &amp;&amp; A[i]%2 ==0 ) min = A[i]; 条件永远不会成立。

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

    【讨论】:

    • 如果数组中的值完全等于 INT_MAX(2 的补码机器上的奇数),则使用 min = INT_MAX 不起作用
    • @ikegami 这样的极端情况可以在代码中处理..这只是 sn-p。
    • 如果所有数字都是奇数,最小的偶数是多少?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 2021-03-10
    相关资源
    最近更新 更多