首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

「海選女主角」矩陣絕對值最大值:fabs與abs的類型陷阱

     編輯:關於C

問題描述

給定n×m矩陣,找出絕對值最大的元素,輸出其行號、列號(1-based)及原始值。多組測試至EOF。

核心邏輯

int main() {
    int n, m, a[101][101];
    while (scanf("%d %d", &n, &m) == 2) {
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < m; ++j)
                scanf("%d", &a[i][j]);

        int max_val = a[0][0], max_r = 0, max_c = 0;
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < m; ++j)
                if (abs(a[i][j]) > abs(max_val)) {  // 關鍵:比較絕對值
                    max_val = a[i][j];
                    max_r = i; max_c = j;
                }
        printf("%d %d %d\n", max_r+1, max_c+1, max_val);
    }
    return 0;
}

關鍵陷阱:abs vs fabs

函數頭文件參數類型返回類型適用場景
absstdlib.hintint整數
labsstdlib.hlonglong長整數
llabsstdlib.hlong longlong long長長整數
fabsmath.hdoubledouble浮點數
fabsfmath.hfloatfloat單精度
fabslmath.hlong doublelong double長雙精度

為什麼GCC編譯abs報錯/行為異常?

  1. 隱式聲明:未包含stdlib.h,C89隱式聲明int abs(),傳入double截斷
  2. 宏展開衝突:某些頭文件#define abs(x) ((x)>0?(x):-(x)),參數副作用/類型不匹配
  3. C++重載:cstdlib提供std::abs重載,g++自動選擇正確版本;gcc需顯式用abs(int)/labs/fabs

正確做法

#include <stdlib.h>  // 必須包含,提供abs/labs/llabs
#include <math.h>     // 提供fabs系列

// 整數矩陣:用abs (int) 或 labs (long)
if (abs(a[i][j]) > abs(max_val))  // ✅ 正確

// 若矩陣元素為double:
if (fabs(a[i][j]) > fabs(max_val)) // ✅ 正確

邊界條件

  • 矩陣全0 → 輸出第一個元素位置(1,1)值0
  • 多個相同最大絕對值 → 題目通常取首個遇到的(行優先掃描自然滿足)
  • INT_MIN絕對值溢出:abs(-2147483648)未定義行為,可用labs或手寫(x<0? -(long)x : x)

複雜度

時間 O(n·m),空間 O(1) 額外空間(原地掃描)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved