輸入 n×m 整數矩陣,找出絕對值最大的元素,輸出其 1-based 行列索引及原始值。多組測試至 EOF。
abs() vs fabs()abs(int) 定義於 <stdlib.h>,參數與返回值均為 int。fabs(double) 定義於 <math.h>,參數與返回值為 double。int 調用 fabs() 會隱式轉換為 double,比較時 fabs(int) > fabs(int) 正常;但若直接賦值給 int max 會截斷小數部分(此處無影響)。真正問題在於 未包含 math.h 時 fabs 隱式聲明為返回 int,導致錯誤鏈接或運行時錯誤。GCC 編譯嚴格要求顯式聲明,G++ 隱式包含 C++ 標準庫較寬鬆。<math.h> 並用 fabs((double)val),或#define IABS(x) ((x)>=0?(x):-(x)),避免函數調用開銷與類型陷阱。#include <stdio.h>
#include <stdlib.h> // for abs(int)
#define IABS(x) ((x) >= 0 ? (x) : -(x))
int main() {
int n, m;
while (scanf("%d %d", &n, &m) == 2) {
int max_val = 0, max_r = 0, max_c = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int val; scanf("%d", &val);
if (IABS(val) > IABS(max_val)) {
max_val = val; max_r = i; max_c = j;
}
}
}
printf("%d %d %d\n", max_r+1, max_c+1, max_val);
}
return 0;
}
若有多個元素絕對值相等且最大,題目未指定輸出哪個。通常取首次出現(上述代碼行為)。若需全部輸出,可動態記錄位置列表。
| 場景 | GCC (C) | G++ (C++) |
|---|---|---|
未含 math.h 用 fabs | 警告:隱式聲明;鏈接錯誤或運行錯誤 | 通常通過(C++ 標準庫可能隱式包含) |
含 math.h 用 fabs | 正常(需 -lm 鏈接) | 正常 |
用 abs(int) 含 stdlib.h | 正常 | 正常(cstdlib) |
stdlib.h 用 abs,math.h 用 fabs。-Wall -Wextra -pedantic 捕獲隱式聲明警告。