【问题标题】:Smallest odd number in given array给定数组中的最小奇数
【发布时间】:2019-06-08 08:46:00
【问题描述】:

这段代码应该在给定数组中找到最小的奇数并将其存储在min,但是当我尝试打印min时,它总是打印0

int smallestodd(int x[5]){
  int j;
  int k[5];
  int p = 0;
  int r = 0;

  for(int h =0; h<5;h++){

    j = x[h] % 2;
    if(j == 1){
      int temp =x[h];
      k[p] =temp;
      p++;
    }
  }

  int min = k[0];


  while(k[r] !=0){
    if(k[r] < min ){
      min = k[r];
      r++;
    }
  }

  return min;
}

【问题讨论】:

  • 当您在if(k[r] &lt; min ) 中更新r 并且min 被初始化为k[0] 时,您有无限循环。
  • 这似乎是learn how to debug your programs 的好时机。
  • 这不会打印任何东西。
  • 为什么要保留 k[] 将 min 初始化为 x 中的第一个元素(或某个较大的值)就足够了,然后查看其余部分,如果较小且奇数,则分配给 min
  • 还要注意局部变量(包括数组)不会自动初始化。未初始化的变量将具有 indeterminate(并且看似随机)的值。这意味着循环条件k[r] !=0 是错误的(因为数组中可能没有任何元素等于零)。您在变量p 中拥有k 中有效元素的数量。使用它。

标签: c arrays function for-loop


【解决方案1】:

其实很简单。您只需检查阵列上的 2 个条件。

int smallestOdd(int arr[]){
    int min = 99999; //Some very large number
    for(int i = 0; i < (length of your array); i++) {
        if(arr[i]%2 != 0 && arr[i] < min) { //Check if number is odd and less than the current minimum value
            min = arr[i];
        }
    }
    return min;
}

【讨论】:

  • int min = 99999; - 这让我不寒而栗
  • 这行得通,谢谢,但我需要找到适用于一切的算法。
  • 而不是 99999,最好使用最大的 int - 这很奇怪:int min = INT_MAX;
【解决方案2】:

假设数组中有一个奇数 -- 假设试图在一个只有偶数(或没有数字)的数组中找到最小奇数是 UB :)

index = 0;
while (arr[index] % 2 == 0) index++; // skip even numbers
min = arr[index++]; // first odd number
while (index < length) {
    if (arr[index] % 2) {
        if (arr[index] < min) min = arr[index];
    }
    index++;
}

【讨论】:

  • 这看起来像是在工作,但是当我编译它时,它有时会给出正确的数字,但一旦我不明白它甚至给出了偶数,你能为此编写整个代码吗?
  • https://ideone.com/ReMpmO;我在第一个版本中有一个小错误,对不起:)
【解决方案3】:

此代码避免了搜索溢出并在找到时返回 1,如果数组只有偶数则返回 0。

int getMinOdd(int arr[], int length, int *value) {
    int found = 0;
    for(int idx=0; idx < length; idx++) {
        if (arr[idx] % 2) {
            if (!found || *value > arr[idx]) {
                *value = arr[idx];
            }
            found = 1;
        }
    }
    return found;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多