You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言查找数组最接近值函数总返回首元素,如何定位代码错误

问题根因

你参考的示例代码的二分查找逻辑仅适配升序排列的数组,但你替换的数组是降序排列的:{ 2970, 2950, 2930, 2910, 2880, 2860, 2840 },数值从左到右依次减小。
当你输入目标值2900时,第一个边界判断if (target <= arr[0])(2900 <= 2970 结果为真)直接触发,返回了数组第一个元素2970,这就是无论输入什么值只要小于2970都返回第一个元素的原因。


修复方案

方案1:将数组改为升序排列(改动最小,无需修改查找逻辑)

把get_temperature函数里的数组改成从小到大排列即可:

int arr[] = { 2840, 2860, 2880, 2910, 2930, 2950, 2970 };

改完后输入2900就会正常返回2910。

方案2:修改查找逻辑适配降序数组

如果要保留当前降序数组的写法,需要调整getNearestElement的判断逻辑:

  1. 翻转前两个边界判断的条件
  2. 二分查找分支的大小判断对应翻转
    同时建议给差值计算加绝对值,避免负数导致的判断错误,修改后的代码如下:
static int getNearest(int x, int y, int target) {
   if (abs(target - x) >= abs(target - y))
      return y;
   else
      return x;
}

static int getNearestElement(int arr[], int n, int target) {
   // 降序数组:比第一个元素大就直接返回第一个
   if (target >= arr[0]){
      return arr[0];
   }
   // 降序数组:比最后一个元素小就直接返回最后一个
   if (target <= arr[n - 1]){
      return arr[n - 1];
   }

   int left = 0, right = n, mid = 0;
   while (left < right) {
      mid = (left + right) / 2;
      if (arr[mid] == target){
         return arr[mid];
      }
      // 降序数组:目标比当前mid值大,往左侧查找
      if (target > arr[mid]) {
         if (mid > 0 && target < arr[mid - 1]){
            return getNearest(arr[mid - 1], arr[mid], target);
         }
         right = mid;
      }
       // 降序数组:目标比当前mid值小,往右侧查找
       else {
         if (mid < n - 1 && target > arr[mid + 1]){
            return getNearest(arr[mid], arr[mid + 1], target);
         }
         left = mid + 1;
      }
   }
   return arr[mid];
}

内容的提问来源于stack exchange,提问作者TheBestPlayer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:27:03